销毁事件执行绑定函数5次

时间:2019-10-10 18:02:18

标签: python events tkinter bind destroy

我使用tkinter模块在python中有一些代码。我一直在尝试将功能绑定到"<Destroy>",但是每次运行代码并关闭窗口时,绑定的功能将执行5次。这是代码:

def bind_events(self):
        ''' binding the events to their functions '''

        self.master.bind("<Destroy>", lambda x: print("OK"))

此代码是一个类函数。然后输出我得到这个:

>>> OK
OK
OK
OK
OK

此问题是否有解决方案?谢谢您的时间,对不起我的英语。

1 个答案:

答案 0 :(得分:2)

如果将事件绑定到根窗口,则该绑定将附加到每个窗口小部件。因此,如果您有一个包含四个其他小部件的根窗口,则销毁该窗口时,绑定函数将被调用五次-每个小部件一次。

看到这种情况的一种简单方法是修改函数,使其不仅打印“确定”,而且还打印与事件关联的小部件:

self.master.bind("<Destroy>", lambda event: print("{}: OK".format(event.widget)))

这与以下事实有关:您实际上并没有绑定到窗口小部件本身,而是要绑定到具有相同名称的绑定标签小部件。每个小部件除了自身之外,还具有一组与之关联的绑定标签:

  • 它将具有自身的绑定标签
  • 它将为小部件类(这是小部件获得其默认行为的方式)的绑定标记
  • 该窗口小部件的顶层窗口(或根目录)将具有一个绑定标签,
  • 它将具有特殊的绑定标签“ all”

因此,当您绑定到根窗口时,任何小部件都会继承该绑定。如果要绑定到根窗口,而仅绑定到根窗口,最常见的解决方案是绑定到一个函数,在该函数中,仅对窗口小部件执行操作就是根窗口。

例如:

def on_destroy(self, event):
    if event.widget == self.master:
        print("{}: OK".format(event.widget))

self.master.bind("<Destroy>", self.on_destroy)