我正在尝试学习 tkinter,我的想法要求它全屏显示。然而,在使其全屏显示之前,我想确保可以使用转义关闭窗口。因此,通过 Stack Overflow 上与此类似的其他问题,我一直试图让它在我按转义键时销毁 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`
Run Code Online (Sandbox Code Playgroud)
这让我很困惑,因为我认为我根本没有调用任何参数,更不用说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()
Run Code Online (Sandbox Code Playgroud)
当您将函数绑定到事件时,tkinter 总是将事件对象传递给该函数。该destroy函数不带参数,这意味着您不能直接绑定到它。您需要绑定到一个接受事件对象作为参数的函数。
由于您已经有一个函数,因此可以给它一个可选的命名参数,以便您可以在没有参数的情况下继续调用函数,但它也可以在绑定中使用:
class Window(Frame):
def __init__(self, master = None):
...
master.bind('<Escape>', self.close)
def close(self, event=None):
self.master.destroy()
Run Code Online (Sandbox Code Playgroud)
您还可以使用匿名函数:
master.bind('<Escape>', lambda event: master.destroy())
Run Code Online (Sandbox Code Playgroud)