当我将<destroy>绑定到顶级小部件时,bind函数将执行6次于一次

时间:2018-12-21 14:50:08

标签: python tkinter

collectstatic

如果我关闭“顶层”窗口,它将打印6个“运行”,并且文本小部件还会插入我输入的6倍的文本。 enter image description here enter image description here

1 个答案:

答案 0 :(得分:1)

当您绑定到Toplevel小部件时,绑定将应用于该小部件及其所有后代。如果仅希望事件由Toplevel小部件处理,则常见的解决方案是检查与该事件关联的小部件对象。

例如,您可以使用winfo_toplevel()来获取与任何给定窗口小部件相关联的顶层窗口小部件,并且仅在与事件相关联的窗口小部件与与事件相关联的顶层窗口相同的情况下才执行操作。 >

例如:

def save_attr(self, event):
    if event.widget == event.widget.winfo_toplevel():
        ...

发生这种情况的原因是事件的处理方式。将事件绑定到窗口小部件时,实际上并没有绑定到窗口小部件。相反,您绑定到与小部件的内部名称相同名称的 binding标签。处理事件后,该事件将应用于与窗口小部件关联的每个绑定标签。因此,如果绑定到Toplevel小部件,则实际上是绑定到与小部件同名的标签。

窗口小部件的默认绑定标签集包括窗口小部件,但也包括包含窗口小部件的顶层窗口。完整列表包括窗口小部件,窗口小部件的类名(例如:Label,Button等),窗口最近的顶级祖先的名称以及特殊字符串“ all”。

在绑定到<Destroy>的情况下,顶级被销毁时,也会导致其所有子级被销毁。例如,如果在顶层有一个标签,它还将获得<Destroy>事件。由于标签具有与Toplevel小部件相关联的绑定标签,因此除了由Toplevel本身处理之外,还将为标签调用绑定函数。