【发布时间】:2014-06-05 11:41:27
【问题描述】:
我有一个程序,它在某些时候会打开一个新窗口(充满按钮和小玩意供用户选择和使用),其定义如下:
def window(self,master):
def close(self):
# change some variables
self.destroy()
top = self.top = Toplevel()
# Several lines of buttons
top.lift()
top.protocol("WM_DELETE_WINDOW",close(self))
我最初在那里有一个关闭按钮,可以很好地包装所有内容,但我注意到如果用户在窗口角落使用标准“X”,则显然不会调用此函数,这会产生很多以后的问题。我从本网站上的其他一些问题中发现了“WM_DELETE_WINDOW”建议,但它给了我一个相当奇怪的错误:
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1630, in wm_protocol
'wm', 'protocol', self._w, name, command)
TclError: bad window path name ".33862072"
我认为它以某种方式获取了错误的窗口 ID 并且无法捕获该事件。因此,我的问题是,这是真的还是假的,其次我应该如何继续处理这个问题。
【问题讨论】:
-
好吧
top.protocol("WM_DELETE_WINDOW",self.close) -
我对@987654324@并不完全熟悉,但如果它类似于
bind,那么您可能实际上是在最后一行调用close,而不是将其注册为回调为WM_DELETE_WINDOW。注册需要参数的函数的典型解决方案是将它们包装在 lambda 中:top.protocol("WM_DELETE_WINDOW", lambda: close(self)) -
@Kevin 这完全让我忘记了,我现在觉得自己像个白痴:(