2010-07-21 14 views
18
widget.bind('<Button-1>',callback) # binding 

def callback(self,event) 
    #do something 

Necesito pasar un argumento al callback(). El argumento es un objeto de diccionario.Cómo pasar un argumento al controlador de eventos en tkinter?

+0

Se debe pasar desde la unión, o cuando se realiza la devolución de llamada? –

+0

debería pasar un argumento cuando se realiza la devolución de llamada – sag

Respuesta

8

¿Qué hay de

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

dando Excepción: leftClickCallback() obtuvo un argumento de palabra clave inesperado 'param' – sag

+0

¿Tiene su devolución de llamada como el argumento param? Esto funciona bien de mi parte – luc

+0

self.l.bind ("", functools.partial (self.leftClickCallback, param = fi)) este es el enlace step.whats wrong here? – sag

4

Creo que en la mayoría de los casos no es necesario ningún argumento para una devolución de llamada debido a la devolución de llamada puede ser un método de instancia que pueden acceder los miembros de 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('<Button-1>', obj.callback) 
btn.pack() 
root.mainloop() 

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

34

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

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

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

Tenga en cuenta que la arg aprobada en convierte en sólo un argumento normal que se utiliza al igual que todos los demás argumentos:

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

¿cómo acceder a ese argumento en el controlador de eventos? cuál debería ser la declaración del controlador – sag

+0

@sag: ver mi edición. Respuesta corta: accede a ella como cualquier otro argumento. –

+0

muchas gracias Bryan. es perfecto . – sag

1

Pasar la función de devolución de llamada a la instancia y lo llaman 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('<Button-1>', obj.callback) 
btn.pack() 
0

Aquí es la solución más simple y más fácil de leer de todos ellos pienso:

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 
+0

Por favor explique los votos a la baja. Este es un foro para aprender. –

+1

Probablemente porque hiciste en dos pasos lo que podrías haber hecho en uno. Solo es mi opinión. – ihayet

0

También puede proporcionar argumentos a una función de devolución de llamada de un widget, dada únicamente que se define este widget como parte de una definición de clase ,, es decir, consideran que este pequeño programa Python 2.7 (sin las partes responsables de la ejecución del programa):

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 

NOTA QUE los argumentos proporcionados debe procederse con self.

Cuestiones relacionadas