2017-06-23 86 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(i)'...試試! – zaidfazil

+0

作一個參數傳入delete函數,不要依賴全局變量。 – Natecat

+0

不可以。因爲這些函數是無狀態的,所以這裏不可能有參數。我認爲全球化是必要的。 –

回答

1

一般來說,我會建議不要使用全局變量,因爲你對誰可以修改它們以及如何控制的能力較少。但在這種情況下,您的StartDelete函數正在由主循環調用。你可以創建一個容器對象並在你的方法中使用它。

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

然後,你Tkinter的代碼中,你可以使用它像這樣:

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 

您也可以處理用戶雙擊或單擊按鈕1周更多的時間比他們應該這樣。

如果你覺得冒險,你可以添加__setattr____getattr__方法來控制當你不應該修改rect實例時會發生什麼。

+0

非常感謝!這工作得很好! –

+0

完成。但我不能投票,因爲我沒有足夠的聲望,因爲我剛加入堆棧溢出。 –

+0

@danielmcgregor不用擔心。祝你好運。 –