在Tkinter中,我有一个绑定到鼠标左键的多个小部件。它们都会在单击时触发相同的事件。
如何恢复点击的小部件?
我希望如此,当按下Label2
时,我将能够恢复Label2
是触发事件中按下的小部件。
答案 0 :(得分:13)
def f(event):
caller = event.widget
答案 1 :(得分:11)
你有几个选择。一种方法是访问事件对象的widget
属性。另一种方法是将对象引用传递给您的函数。这是一个使用其中一个的示例。
import Tkinter as tk
def OnClickA(event):
print "you clicked on", event.widget
event.widget.config(text="Thank you!")
def OnClickB(event, obj):
print "you clicked on", obj
obj.config(text="Thank you!")
root = tk.Tk()
l1 = tk.Label(root, text="Click me")
l2 = tk.Label(root, text="No, click me!")
l1.pack()
l2.pack()
l1.bind("<1>", OnClickA)
l2.bind("<1>", lambda event, obj=l2: OnClickB(event, obj))
root.mainloop()
答案 2 :(得分:2)
听起来你的所有小部件都在共享一个事件处理程序。 John W. Shipman - NM Tech的 Tkinter 8.4 Reference 摘录可能有所帮助。
<强> 30.7. The extra arguments trick 强>
有时候你想通过其他人 除了the之外的处理程序的参数 事件
这是一个例子。假设你的 应用程序有一个十个数组 存储小部件的检查按钮 在列表
self.cbList
中,索引为range(10)
中的复选按钮号。进一步假设你要写 一个名为
.__cbHandler
的处理程序 所有十个事件中<Button-1>
个事件 这些支票。处理程序可以 获取实际的Checkbutton
小部件 通过引用它来触发它.widget
的{{1}}属性 传入的对象,但是如何传入 它发现了checkbutton的Event
中的索引?编写我们的处理程序会很好 有一个额外的论据 检查按钮号,类似于 这样:
self.cbList
但事件处理程序只传递一个 争论,事件。所以我们不能用 以上功能因为a 参数数量不匹配。
幸运的是,Python的能力 为函数提供默认值 争论给了我们一条出路。有一个 看看这段代码:
def __cbHandler ( self, event, cbNumber ):
def __createWidgets ( self ): ? self.cbList = [] # Create the checkbutton list for i in range(10): cb = Checkbutton ( self, ? ) self.cbList.append ( cb ) cb.grid( row=1, column=i ) def handler ( event, self=self, i=i ): # [1] return self.__cbHandler ( event, i ) cb.bind ( "<Button-1>", handler ) ? def __cbHandler ( self, event, cbNumber ): ?
[1]这些行定义了一个新函数 预计有三个#
参数。第一个参数是handler
对象传递给所有事件 处理程序,第二和第三 参数将设置为默认值 值?我们需要的额外参数 通过它。这项技术可以扩展到 提供任何数量的额外 处理程序的参数。
一种稍微简洁的方法,就像Bryan Oakley为his answer中的第二个按钮所做的那样,是将每个处理函数定义为与lambda一致,即:
Event