在Tkinter中,我有一个绑定到鼠标左键的多个小部件。点击时它们都会触发相同的事件。获取触发事件的小部件?
如何恢复点击了哪个小部件?
我想要它,所以当说按下Label2
时,我可以恢复那Label2
是在它触发的事件中按下的小部件。
在Tkinter中,我有一个绑定到鼠标左键的多个小部件。点击时它们都会触发相同的事件。获取触发事件的小部件?
如何恢复点击了哪个小部件?
我想要它,所以当说按下Label2
时,我可以恢复那Label2
是在它触发的事件中按下的小部件。
def f(event):
caller = event.widget
你有几个选项。一种方法是访问事件对象的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()
听起来就像所有的小工具共享一个事件处理程序。 John W. Shipman-NM Tech的Tkinter 8.4 Reference摘录可能有所帮助。
30.7. The extra arguments trick
有时你想其他 参数传递到处理程序除了 事件。
这里是一个例子。假设你的 应用程序有一个数组 检查按钮的小工具被存储在列表
self.cbList
列表 ,索引range(10)
中的检查按钮号码。进一步假设你想要写 为
<Button-1>
事件命名.__cbHandler
一个处理程序 的所有十个这些checkbuttons。该处理器可以 得到实际Checkbutton
部件 通过参考获取传递在Event
对象的.widget
属性触发它,而是如何 它在self.cbList
找出checkbutton的 指数?这将是很好写我们的处理 与该 checkbutton数一个额外的参数,如 这样的:
def __cbHandler (self, event, cbNumber):
但事件处理程序传递只有一个 的说法,该事件。所以我们不能使用上面的函数 ,因为参数数量不匹配。
幸运的是,Python的功能 为函数 提供了默认值,为我们提供了一条出路。有 看看这个代码:
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
这需要三个 参数。第一个参数是传递给所有事件 处理程序Event
对象,而第二和第三 参数将被设置为默认值 ?我们需要 额外的参数传递给它。该技术可以扩展为 向处理程序提供任意数量的附加 参数。
稍微更简洁的方式来做到这一点,因为布赖恩Oakley在his answer做为第二按钮,是定义在线与一个lambda每个处理程序的功能,即:
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)
cb.bind ("<Button-1>", lambda event, self=self, i=i:
self.__cbHandler(event, i))
?
def __cbHandler (self, event, cbNumber):
?