Tkinter 转义绑定不破坏

0 python tkinter python-3.x

我正在尝试学习 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)

Bry*_*ley 5

当您将函数绑定到事件时,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)