2

为什么单击子元素不会传播到父元素?

from tkinter import *

root = Tk()

def handler(event):
    print('clicked at', event.x, event.y)

frame = Frame(root, width=100, height=100)
label = Label(frame, text="Label")
frame.bind('<Button-1>', handler)
frame.pack()
label.pack(side=TOP)

root.mainloop()

当我运行它时,单击标签不会触发处理程序。我知道事件默认传播给父母,如果你不想这样,你必须返回“break”

4

2 回答 2

5

您最初对事件传播到其父级的理解是错误的。他们不。

诚然,作为顶层或根窗口的直接后代的小部件存在边缘情况。即使在那里,它们也不是传播到它们的父级,而是它们被绑定标签定义的其他绑定处理,并且默认情况下,每个小部件都有它的顶级窗口作为它的绑定标签之一。

如果您想将绑定设置为在任何地方都可以使用该bind_all方法,因为默认情况下每个小部件都有一个“全部”绑定标签。另一种选择是为多个小部件提供相同的绑定标签(使用该bindtags方法),然后使用 .bind 绑定到该绑定标签bind_class。您做出的选择取决于您要完成的工作。

bindtags 非常强大——可以说比任何其他工具包中的任何绑定机制都更强大。例如,如果您需要传播事件,您可以通过调整每个小部件的绑定标签以包含其所有祖先来实现。然而,根据我的经验,很少需要这种恶作剧。

于 2012-09-10T18:36:06.013 回答
0

你错了。 "break"导致该事件不会传播到单击的小部件的其他处理程序。

换句话说,如果你将你的动作绑定到label,然后你将另一个动作绑定到第一个按钮上label,两个回调都将被调用(除非你"break"从第一个被调用的回调中返回。)

不过,我不确定是否有解决方法……(我们可能需要等待 BryanOakley 出现;)

于 2012-09-10T17:06:43.667 回答