为什么不点击子元素会传播到父元素?
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”
答案 0 :(得分:5)
您原来的理解是错误的,即事件会传播到其父级。他们没有。
不可否认,小部件有一个边缘情况,它是顶层窗口或根窗口的直接后代。即使在那里,也不是它们传播到它们的父节点,而是它们由绑定标签定义的其他绑定处理,并且默认情况下每个小部件都有它的顶层窗口作为其绑定标记之一。
如果要将绑定设置为无处不在,可以使用bind_all
方法,因为默认情况下每个窗口小部件都有一个“all”绑定标记。另一个选项是为几个小部件提供相同的绑定标签(使用bindtags
方法),然后使用bind_class
绑定到该绑定标签。你做出的选择取决于你想要完成的任务。
bindtags非常强大 - 可以说比任何其他工具包的任何绑定机制更强大。例如,如果您需要让事件传播,您可以通过调整每个窗口小部件的绑定标记来包含其所有祖先。然而,根据我的经验,很少需要这样的诡计。
答案 1 :(得分:0)
"break"
导致该事件不会传播到单击的窗口小部件的其他处理程序。
换句话说,如果您将操作绑定到label
,然后将另一个操作绑定到label
上的第一个按钮,则会调用两个回调(除非您从"break"
返回{{1}}第一个被称为。)
我不确定是否有解决方法......(我们可能需要等待BryanOakley出现;)