python - 如何捕获 tkinter 子部件上的事件?

标签 python events tkinter

在下面的 block 中,点击 a_frame 触发事件处理程序 on_frame_click,但是点击 a_label 的子级a_frame 没有。有没有办法强制 a_frame 捕获和处理源自其子项的事件(最好不必直接向子项添加处理程序)?我正在使用 Python 3.2.3。

import tkinter

def on_frame_click(e):
    print("frame clicked")

tk = tkinter.Tk()
a_frame = tkinter.Frame(tk, bg="red", padx=20, pady=20)
a_label = tkinter.Label(a_frame, text="A Label")
a_frame.pack()
a_label.pack()
tk.protocol("WM_DELETE_WINDOW", tk.destroy)
a_frame.bind("<Button>", on_frame_click)
tk.mainloop()

最佳答案

是的,您可以随心所欲,但这需要一些工作。并不是说它不受支持,只是实际上很少需要这样的东西,所以这不是默认行为。

TL;DR - 研究“tkinter 绑定(bind)标签”

Tkinter 事件模型包括“绑定(bind)标签”的概念。这是与每个小部件关联的标签列表。当在小部件上接收到事件时,将检查每个绑定(bind)标记以查看它是否具有事件的绑定(bind)。如果是,则调用处理程序。如果没有,它将继续。如果处理程序返回“break”,则链被破坏并且不再考虑更多标签。

默认情况下,小部件的绑定(bind)标签是小部件本身、小部件类、小部件所在的顶层窗口的标签,最后是特殊标签“all”。但是,您可以在其中放置任何您想要的标签,并且可以更改顺序。

这一切的实际结果是什么?您可以将自己的唯一标签添加到每个小部件,然后将单个绑定(bind)添加到将由所有小部件处理的该标签。这是一个示例,使用您的代码作为起点(我添加了一个按钮小部件,以表明这不仅仅是框架和标签的特殊之处):

import Tkinter as tkinter

def on_frame_click(e):
    print("frame clicked")

def retag(tag, *args):
    '''Add the given tag as the first bindtag for every widget passed in'''
    for widget in args:
        widget.bindtags((tag,) + widget.bindtags())

tk = tkinter.Tk()
a_frame = tkinter.Frame(tk, bg="red", padx=20, pady=20)
a_label = tkinter.Label(a_frame, text="A Label")
a_button = tkinter.Button(a_frame, text="click me!")
a_frame.pack()
a_label.pack()
a_button.pack()
tk.protocol("WM_DELETE_WINDOW", tk.destroy)
retag("special", a_frame, a_label, a_button)
tk.bind_class("special", "<Button>", on_frame_click)
tk.mainloop()

有关绑定(bind)标签的更多信息,您可能对 my answer 感兴趣问题How to bind self events in Tkinter Text widget after it will binded by Text widget? .答案解决的问题与此处的问题不同,但它显示了使用绑定(bind)标签解决现实世界问题的另一个示例。

关于python - 如何捕获 tkinter 子部件上的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11456631/

相关文章:

php - 将 Magento 订单导入 Openerp

java - 如何正确设置自定义事件

python - 了解 Tkinter 的 Entry 小部件中的插入方法

python - 由于某种原因无法在Python2.7中调用Tkinter模块

python - TKinter 更新图片列表

Python:逻辑回归给出 ValueError:未知标签类型: 'continuous'

python - 绘制 numpy 数组 : setting axis scale

events - 用于 CQRS 事件发布设置的 NServiceBus

java - android一键下多个事件

城市 map 上的 Python 绘图点