widget.bind('<Button-1>',callback) # binding
def callback(self,event)
#do something
我需要将参数传递给callback()
。参数是一个字典对象。
答案 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.