¿Cómo pasar un argumento al controlador de eventos en tkinter?

widget.bind('',callback) # binding def callback(self,event) #do something 

Necesito pasar un argumento para callback() . El argumento es un objeto de diccionario.

Puede usar lambda para definir una función anónima, como:

 data={"one": 1, "two": 2} widget.bind("", lambda event, arg=data: self.on_mouse_down(event, arg)) 

Tenga en cuenta que el argumento que se pasa se convierte en solo un argumento normal que usa como todos los demás argumentos:

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

Qué pasa

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

Creo que en la mayoría de los casos no necesita ningún argumento para una callback porque la callback puede ser un método de instancia que puede acceder a los miembros de la instancia:

 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('', obj.callback) btn.pack() root.mainloop() 

Pero creo que la solución de functools propuesta por Philipp también es muy buena.

Pase la función de callback a la instancia y llámela desde el método de instancia.

 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('', obj.callback) btn.pack() 

Aquí está la solución más simple y fácil de leer de todas ellas, creo:

 widget.bind('', 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 

También puede proporcionar argumentos a una función de callback de un widget, dado que este widget se define como parte de una definición de clase , es decir, considere este pequeño progtwig Python 2.7 (sin las partes responsables de la ejecución del progtwig):

 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 

TENGA EN CUENTA que los argumentos suministrados deben ser procesados ​​por self.