获取触发事件的小部件?

时间:2010-11-28 21:21:13

标签: python events widget tkinter

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

如何恢复点击的小部件?

我希望如此,当按下Label2时,我将能够恢复Label2是触发事件中按下的小部件。

3 个答案:

答案 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