是的,你可以做你想做的,但这需要一些工作。并不是不支持它,只是实际上很少需要这样的东西,所以它不是默认行为。
TL;DR - 研究“tkinter 绑定标签”
Tkinter 事件模型包括“绑定标签”的概念。这是与每个小部件关联的标签列表。当在小部件上接收到事件时,将检查每个绑定标记以查看它是否具有该事件的绑定。如果是这样,则调用处理程序。如果没有,它会继续。如果处理程序返回“break”,则链被破坏并且不再考虑标签。
默认情况下,小部件的绑定标签是小部件本身、小部件类、小部件所在的顶层窗口的标签,最后是特殊标签“all”。但是,您可以在其中放置任何您想要的标签,并且您可以更改顺序。
这一切的实际结果是什么?您可以将自己的唯一标签添加到每个小部件,然后将单个绑定添加到将由所有小部件处理的标签。这是一个示例,使用您的代码作为起点(我添加了一个按钮小部件,以表明这不仅仅是框架和标签的特殊内容):
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()
有关绑定标签的更多信息,您可能会对我对如何在 Tkinter Text 小部件中绑定自身事件的问题的回答感兴趣,之后它将被 Text 小部件绑定?. 答案解决了与此处不同的问题,但它显示了使用绑定标签解决现实世界问题的另一个示例。