拦截关闭窗口按钮(Tkinter窗口)会引发Tcl错误

时间:2014-06-05 11:41:27

标签: python tkinter window

我有一个程序,在某些时候打开一个新窗口(填充按钮和Gizmo供用户选择和玩耍),定义如下:

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并且无法捕获事件。我的问题是,这是真的与否,其次我应该如何继续处理这个问题。

1 个答案:

答案 0 :(得分:0)

让我们检查一下这行代码:

top.protocol("WM_DELETE_WINDOW",close(self))

这行代码说“立即调用函数close(self),并将结果分配给协议处理程序。看到问题?它可能会在close之前立即调用self已完全构造。您不希望该函数被调用,您希望将引用传递给该函数。

close成为self的方法(而不是嵌入式函数)并将调用更改为top.protocol,使其看起来像这样(注意缺少尾部括号):

top.protocol("WM_DELETE_WINDOW", self.close)

如果您希望保留嵌套函数,可以使用lambda:

top.protocol("WM_DELETE_WINDOW", lambda window=self: close(window))