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?
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?
¿Qué hay de
import functools
def callback(self, event, param):
pass
arg = 123
widget.bind("", functools.partial(callback, param=arg))
dando Excepción: leftClickCallback() obtuvo un argumento de palabra clave inesperado 'param' – sag
¿Tiene su devolución de llamada como el argumento param? Esto funciona bien de mi parte – luc
self.l.bind ("
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
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)
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()
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
Por favor explique los votos a la baja. Este es un foro para aprender. –
Probablemente porque hiciste en dos pasos lo que podrías haber hecho en uno. Solo es mi opinión. – ihayet
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.
Se debe pasar desde la unión, o cuando se realiza la devolución de llamada? –
debería pasar un argumento cuando se realiza la devolución de llamada – sag