2017-06-23 8 views
0

このコードでは、rect変数を取得し、それをDeleteメソッドで使用する方法を知りたいと思います。現在、エラーが発生しています。関数から変数を取得する

from tkinter import * 

def createRect(event): 
    rect = w.create_rectangle(50, 25, 150, 75, fill="blue") 
    return rect 

def Start(event): 
    print("Single Clicked") 
    createRect(event) 

def Delete(event): 
    i = createRect(event) 
    print("Double Clicked") 
    w.delete(i.rect) 

root = Tk() 
w = Canvas(root, width=200, height=100) 
w.pack() 
frame = Button(root, text="delete/make") 
frame.bind("<Double-1>", Delete) 
frame.bind("<Button-1>", Start) 
frame.pack() 
root.mainloop() 
+0

'rect'は既に' Delete'関数に入っています。私はあなたがする必要があると思う、 'w.delete(私)' ...それを試みなさい!! – zaidfazil

+0

delete関数に渡す引数を作成し、グローバル変数に依存しないでください。 – Natecat

+0

いいえ、これらの関数はステートレスなので、引数はここでは不可能です。私はグローバルが必要だと思います。 –

答えて

1

一般的に、グローバル変数の使用を制限することはできません。しかし、この場合、あなたのStartDelete関数がmainloopによって呼び出されています。コンテナオブジェクトを作成し、メソッド内で使用することができます。

class MyRect: 
    def __init__(self): 
     self.rect = None 
     self.isSet = False 

次に、あなたのTkinterのコード内で、あなたはこのようにそれを使用することができます:あなたはまた、ユーザーをダブルクリックするか、ボタンをクリックして1回以上、彼らがこのように必要以上を扱うことができる

myrect = MyRect() 

def Start(event): 
    if not myrect.isSet: 
     print("Single Clicked") 
     myrect.rect = createRect(event) 
     myrect.isSet = True 

def Delete(event): 
    if myrect.isSet: 
     print("Double Clicked") 
     w.delete(myrect.rect) 
     myrect.rect = None 
     myrect.isSet = False 

冒険的な気持ちがある場合は、__setattr____getattr__のメソッドを追加して、rectインスタンスを変更してはいけないときにどうなるかを制御できます。

+0

ありがとう!それはうまく動作します! –

+0

が完了しました。しかし、私はスタックオーバーフローに参加したのでまだ十分な評判を得ていないので投票できません。 –

+0

@danielmcgregor心配はいりません。がんばろう。 –

関連する問題