Cuando se crea una unión con bind
, Tkinter añade automáticamente un argumento que tiene información sobre el evento. Tendrá que dar cuenta de eso en su definición rand_func
o en cómo lo llame.
Este argumento es no incluido cuando utiliza el atributo command
. Debe tener cuidado de dar cuenta de este argumento adicional, ya sea en cómo llama a la función en cada caso o en cómo la función interpreta sus parámetros.
Aquí hay una solución que usa lambda
en el enlace para aceptar el evento adicional solo cuando se usa el comando bind
, pero no lo pasa al comando final.
import tkinter as tk
class SampleApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.frame = tk.Frame(self)
self.frame.pack()
self.button = tk.Button(self.frame, text="click me",
command=lambda a=1, b=2, c=3:
self.rand_func(a, b, c))
self.button.pack()
self.frame.bind("<Return>",
lambda event, a=10, b=20, c=30:
self.rand_func(a, b, c))
# make sure the frame has focus so the binding will work
self.frame.focus_set()
def rand_func(self, a, b, c):
print "self:", self, "a:", a, "b:", b, "c:", c
print (a+b+c)
app = SampleApp()
app.mainloop()
Dicho esto, es raro que la unión a un marco sea lo correcto. Por lo general, un cuadro no tendrá el foco del teclado y, a menos que tenga foco, el enlace nunca se disparará. Si está configurando un enlace global, debe vincularse a la etiqueta de enlace "todos" (utilizando el método bind_all) o al widget de nivel superior.
Muchas gracias, ya que sugirió que bind_all era lo que necesitaba; –
Es importante tener en cuenta que _automáticamente se agrega un argumento que tiene información sobre el evento_ se aplica solo a las devoluciones de llamada vinculadas por el método 'bind'. Aquellos vinculados con la opción 'command' (en constructor o con' configure() ') no reciben dicho objeto de evento. Esta distinción no es fácil de detectar en los documentos (al menos no he encontrado ninguna), pero aquí está [confirmación] (https://stackoverflow.com/questions/36726716/what-is-the-difference-between- command-and-bind-in-tkinter) –
@ o'rety: He actualizado la respuesta para abordar sus inquietudes. –