tkinter点击儿童不会传播到父母

don*_*szx 2 python tkinter

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

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()
Run Code Online (Sandbox Code Playgroud)

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

Bry*_*ley 5

您最初的理解是,事件传播到其父级,这是不正确的.他们不.

不可否认,小部件有一个边缘情况,它是顶层窗口或根窗口的直接后代.即使在那里,这并不是说他们传播到他们的父母,而是他们通过绑定变量的定义正在被其他绑定处理,默认情况下每个部件都有它的顶层窗口,它的一个绑定标签.

如果要将绑定设置为可在任何位置使用,则可以使用该bind_all方法,因为默认情况下每个窗口小部件都有一个"all"绑定标记.另一种选择是为几个小部件提供相同的绑定标签(使用该bindtags方法),然后使用绑定到该绑定标签bind_class.您做出的选择取决于您要完成的任务.

bindtags非常强大 - 可以说比任何其他工具包的任何绑定机制更强大.例如,如果您需要传播事件,则可以通过调整每个窗口小部件的绑定标记来包含其所有祖先.然而,根据我的经验,很少需要这样的诡计.