如何将参数传递给tkinter中的事件处理程序?

时间:2010-07-21 06:51:56

标签: python events binding arguments tkinter

widget.bind('<Button-1>',callback)   # binding 

def callback(self,event)
    #do something

我需要将参数传递给callback()。参数是一个字典对象。

7 个答案:

答案 0 :(得分:40)

您可以使用lambda来定义匿名函数,例如:

data={"one": 1, "two": 2}

widget.bind("<ButtonPress-1>", lambda event, arg=data: self.on_mouse_down(event, arg))

请注意,传入的arg只是一个普通的参数,就像所有其他参数一样:

def on_mouse_down(self, event, arg):
    print(arg)

答案 1 :(得分:9)

怎么样?
import functools
def callback(self, event, param):
    pass
arg = 123
widget.bind("", functools.partial(callback, param=arg))

答案 2 :(得分:4)

我认为在大多数情况下你不需要任何回调参数,因为回调可以是一个可以访问实例成员的实例方法:

from Tkinter import *

class MyObj:
    def __init__(self, arg):
        self.arg = arg

    def callback(self, event):
        print self.arg

obj = MyObj('I am Obj')
root = Tk()
btn=Button(root, text="Click")
btn.bind('<Button-1>', obj.callback)
btn.pack()
root.mainloop()

但我认为Philipp提出的functools解决方案也非常好

答案 3 :(得分:1)

将回调函数传递给实例,并从实例方法中调用它。

from tkinter import *

class MyClass:

    def __init__(self, my_callback, message):
        self.my_callback = my_callback
        self.message = message

    def callback(self, event):
        self.my_callback(self)

def my_callback(o):
    print(o.message)


obj = MyClass(my_callback, "I am instance of MyClass")

root = Tk()

btn=Button(root, text="Click")
btn.bind('<Button-1>', obj.callback)
btn.pack()

答案 4 :(得分:1)

以下是新墨西哥科技Tkinter 8.5参考(https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/extra-args.html)的相关条目 ‌‌‌‌ ‌‌‌‌ ‌‌‌‌ p‍‌‌‌‌‍ ‌ ‌‌‌‌

‌‌‌‌ ‌‌‌‌ ‌‌‌‌ ‌‌‌‌‌ ‌‌‌‌‌ p p p

这样,您可以根据需要添加任意数量的参数:

‌‌‌‌ ‌‌‌‌ ‌‌‌‌ ‌‌‌‌ ‌‌‌‌‌ p p p p

54.7。多余的参数把戏

有时您希望将其他参数传递给事件以外的处理程序。

这里是一个例子。假设您的应用程序有十个检查按钮组成的数组,其>小部件存储在列表self.cbList中,并由> range(10)中的检查按钮编号索引。

进一步假设您要为所有这十个检查按钮中的事件编写一个名为.__ cbHandler的处理程序。处理程序可以通过引用传入的Event对象的.widget属性来获取触发它的实际Checkbutton> widget,但是如何在self.cbList中找出checkbutton的索引呢?

最好为我们的处理程序编写一个带有复选按钮编号的参数,例如:

def __cbHandler(self, event, cbNumber):

但是事件处理程序仅传递一个参数,即事件。因此,由于参数数量不匹配,我们不能使用上述功能。

幸运的是,Python能够为函数参数提供默认值,这为我们提供了一条出路。看一下这段代码:

def __createWidgets(self):
    …
    self.cbList = []    # Create the checkbutton list
    for i in range(10):
        cb = tk.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):
    …

这些行定义了一个需要三个参数的新函数处理程序。第一个> argument是传递给所有事件处理程序的Event对象,第二个和第三个> arguments将设置为其默认值,即传递它所需的额外参数。

该技术可以扩展为向> handler提供任意数量的附加参数。

答案 5 :(得分:0)

以下是我认为最简单易读的解决方案:

widget.bind('<Button-1>', callback2)

def callback(self, event, custom_arg=None): #change "None" to whatever you want the default value to be
    #do something

def callback2(self, event):
    callback(event, custom_arg=something_you_set) #set custom_arg to whatever you want it to be when Button-1 is pressed

答案 6 :(得分:0)

您还可以为窗口小部件的回调函数提供参数,只要将此窗口小部件定义为 类定义 的一部分,即考虑这个小python 2.7程序(没有负责程序执行的部分):

import Tkinter as tk #To be able to get "tk.Button" safely
from Tkinter import *

class EXAMPLE(Frame):
    def __init__(self,master=None):
        Frame.__init__(self,master)

        #make the widgets appear to a grid of size = 2 X 2
        for row in range(2):
            self.grid_rowconfigure(row,minsize=20)
        for col in range(2):
            self.grid_columnconfigure(col,minsize=20)

        #Call our METHOD OF INTEREST
        self.AnyMethod()

    #This is our method of interest
    def AnyMethod(self):
        #arguments to be supplied
        self.arg1 = 'I am 1st argument'
        self.arg2 = 'I am 2nd argument'
        self.arg3 = 'I am 3rd argument'

        #Draw the widget, & supply its callback method
        self.widgetname=tk.Button(self.master,text="My Button",command=self.method_callback)
        self.widgetname.grid(row=0,column=0)

    #create a so-called 'shell method' to swallow the REAL callback function
    def method_callback(self):
        func_callback(self.arg1,self.arg2,self.arg3)

#Define the REAL callback function in the Module's scope
def func_callback(arg1,arg2,arg3):
    print arg1
    print arg2
    print arg3

注意提供的参数必须以self.

继续