2017-03-31 81 views
0

我想學習tkinter和我已經要求它在全屏的想法。在全屏顯示之前,我想確保我可以使用轉義關閉窗口。所以通過類似於Stack Overflow的其他問題,我一直試圖讓它在我逃跑時破壞tkinter窗口。對我來說,這似乎像它應該工作,但我得到一個異常時,我打逃脫Tkinter越獄綁定不破壞

`Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Users\Jake\AppData\Local\Programs\Python\Python36- 
32\lib\tkinter\__init__.py", line 1699, in __call__ 
    return self.func(*args) 
TypeError: destroy() takes 1 positional argument but 2 were given` 

這是混淆了我,因爲我不認爲我呼籲所有任何參數更不用說2.我有做添加了一個退出按鈕,該按鈕調用了我所做的close方法,該方法可行,但使用轉義似乎沒有。爲了清晰起見,我提供了我的代碼。我知道這很類似於這裏的很多問題,但我已經嘗試了一切,似乎沒有任何東西可以爲我工作。提前致謝!

import tkinter 
from tkinter import * 

class Window(Frame): 
    def __init__(self, master = None): 
     Frame.__init__(self, master) 

     master.bind('<Escape>', master.destroy) 

     self.init_window() 
    def init_window(self): 
     self.pack(fill=BOTH, expand=1) 
     quitButton = Button(self, text="quit", command=self.close) 
     quitButton.place(x=0, y=0) 

    def close(self): 
     self.master.destroy() 

def main(): 
    root = Tk() 
    root.geometry('500x500') 
    app = Window(root) 
    root.mainloop() 

main() 

回答

3

當你將一個函數綁定到一個事件時,tkinter將總是將一個事件對象傳遞給該函數。 destroy函數不帶任何參數,這意味着你不能直接綁定它。您需要綁定到將接受事件對象作爲參數的函數。

既然你已經有一個功能,你可以給它一個可選的命名參數,這樣就可以繼續打電話給你的函數沒有參數,但它也可以在綁定使用:

class Window(Frame): 
    def __init__(self, master = None): 
     ... 
     master.bind('<Escape>', self.close) 

    def close(self, event=None): 
     self.master.destroy() 

你也可以使用匿名函數:

master.bind('<Escape>', lambda event: master.destroy()) 
+0

OP已經有一個'close'方法;你爲什麼不使用它? – Novel

+0

@Jonathan:你說得對。我會改變我的答案。 –

+0

哦!我沒有意識到事件對象也被傳遞了!非常感謝! –