python - tkinter 对 child 的点击不会传播给 parent

标签 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()

当我运行它时,点击标签不会触发处理程序。我知道默认情况下事件会传播给 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/

相关文章:

python - tkinter 在打开对话框或创建窗口时打开第二个窗口

python - 在 Python 中使用 Tkinter 进行关键事件处理

python - 为什么我的 tkinter 滚动条不工作?

python-3.x - 如何通过按一下按钮将两个值存储到两个条目的变量中?

python - 为什么 "nparray.tolist()"占用这么多空间?

python lxml元素属性问题

python:检查 XSD xml 模式

Python - 使用 httplib 来 PUT JSON 数据

使用 Tkinter 的带有 GUI 的 Python 扫雷游戏如何正确显示在按钮上?

Python-如何在积分中绘制不是被积分值的参数