为什么点击子元素不会传播到父元素?
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()
当我运行它时,点击标签不会触发处理程序。我知道默认情况下事件会传播给 parent ,如果您不希望这样,则必须返回“break”
最佳答案
您最初对事件传播到其父项的理解是错误的。他们没有。
不可否认,作为顶层或根窗口的直接后代的小部件有一个边缘案例。即使在那里,它们也不是传播到它们的父级,而是它们被绑定(bind)标签定义的其他绑定(bind)处理,默认情况下每个小部件都有它的顶层窗口作为它的绑定(bind)标签之一。
如果你想设置绑定(bind)以在任何地方工作,你可以使用 bind_all
方法,因为默认情况下每个小部件都有一个“all”绑定(bind)标签。另一种选择是为多个小部件提供相同的绑定(bind)标签(使用 bindtags
方法),然后使用 bind_class
绑定(bind)到该绑定(bind)标签。您做出哪种选择取决于您要实现的目标。
bindtags 非常强大——可以说比任何其他工具包中的任何绑定(bind)机制都更强大。例如,如果您需要传播事件,您可以通过调整每个小部件的绑定(bind)标签以包含其所有祖先来实现。然而,根据我的经验,很少需要这样的恶作剧。
关于python - tkinter 对 child 的点击不会传播给 parent ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12356068/