Tkinter逃脱绑定不破坏

时间:2017-03-31 18:31:12

标签: python python-3.x tkinter

我正在尝试学习tkinter以及我的想法要求它全屏显示。在全屏显示之前,我想确保可以使用escape关闭窗口。所以通过类似于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`

这对我来说很困惑,因为我认为我根本不会调用任何参数,更不用说2.我已经添加了一个退出按钮,它调用了我制作的close方法并且可以使用escape而不是好像。为清楚起见,我提供了我的代码。我知道这与这里的很多问题类似,但我已经尝试了一切,似乎没有什么对我有用。提前谢谢!

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()

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

以下代码有效。
我在一堂课中使用它在pi的800x480触摸屏上创建全屏应用程序:

class FullScreenApp(object):

    def __init__(self, master, **kwargs):
        self.master=master
        pad=3
        self._geom='200x200+0+0'
        master.geometry('{}x{}'.format(800,480))
        master.bind('<Escape>', self.close)

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