首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >销毁事件执行绑定的函数5次

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

Stack Overflow用户
提问于 2019-10-11 02:02:18
回答 1查看 280关注 0票数 0

我有一些使用tkinter模块的python代码。我一直在尝试将一个函数绑定到"<Destroy>",但每次运行代码并关闭窗口时,绑定的函数都会执行5次。代码如下:

代码语言:javascript
复制
def bind_events(self):
        ''' binding the events to their functions '''

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

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

代码语言:javascript
复制
>>> OK
OK
OK
OK
OK

这个问题有什么解决办法吗?感谢您的宝贵时间,并为我的英语道歉。

EN

回答 1

Stack Overflow用户

发布于 2019-10-11 02:23:54

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

查看这种情况的一种简单方法是修改您的函数,使其不仅打印"OK",还打印与事件关联的小部件:

代码语言:javascript
复制
self.master.bind("<Destroy>", lambda event: print("{}: OK".format(event.widget)))

这与这样一个事实有关,即您实际上并没有绑定到小部件本身,而是绑定到了与小部件同名的绑定标记。除了自身,每个小部件都有一组与之关联的绑定标签:

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

<

  • >F210>

因此,当您绑定到根窗口时,每个小部件都将继承该绑定。如果您想绑定到根窗口,并且只绑定到根窗口,最常见的解决方案是绑定到一个函数,在该函数中,只有小部件的一个操作是根窗口。

例如:

代码语言:javascript
复制
def on_destroy(self, event):
    if event.widget == self.master:
        print("{}: OK".format(event.widget))

self.master.bind("<Destroy>", self.on_destroy)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58328686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档