获取触发事件的小部件?

问题描述 投票:0回答:3

在 Tkinter 中,我有多个小部件绑定到鼠标左键。单击时它们都会触发相同的事件。

如何恢复点击了哪个小部件?

我想要它,所以当按下

Label2
时,我能够恢复
Label2
是在其触发的事件中按下的小部件。


对于那些试图识别被单击的“画布上的项目”的人,必须首先使用此技术来获取画布本身,然后询问画布哪个项目被单击。画布上绘制的东西不是小部件,所以不能“直接”检查它们。有关详细信息,请参阅当单击画布上的矩形时,如何获取该矩形的 ID?

python events widget tkinter
3个回答
25
投票


16
投票
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()



4
投票

Tkinter 8.5 Reference 可能会有所帮助。

54.7。额外的参数技巧 有时您想通过其他 处理程序的参数除了 活动。

这是一个例子。假设你的 应用程序有一个十个数组 存储小部件的检查按钮 在列表

self.cbList

中,索引为

range(10)
中的复选按钮编号。
  
  
进一步假设你想写 一名名为

.__cbHandler

的处理程序

<Button-1>
全部十个事件 这些检查按钮。处理程序可以 获取实际的
Checkbutton
小部件 通过引用触发它
.widget
Event
属性 传入的对象,但是如何 它是否发现该检查按钮的 索引在
self.cbList
  
  
如果能编写我们的处理程序就太好了 有一个额外的参数 检查按钮编号,例如 这个:

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
对象传递给所有事件 处理程序,以及第二个和第三个 参数将被设置为其默认值 值?我们需要的额外参数 通过吧。
  
  
该技术可以扩展到 提供任意数量的额外 处理程序的参数。

一种更简洁的方法,就像 @Bryan Oakley 在他的答案
中对第二个按钮所做的那样,是使用

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): ...


© www.soinside.com 2019 - 2024. All rights reserved.