Comprendiendo el comportamiento de las funciones lambda de Python con el botón Tkinter
Me gustaría entender cómo funciona un botón utilizando lambda.
Tengo el siguiente código de Python:
from tkinter import *
def comando_click(mensaje):
print(mensaje)
menu_inicial = Tk()
menu_inicial.geometry("500x250+200+200")
botao = Button(menu_inicial, text="Executar", command=comando_click("Nova_Mensagem"))
botao.pack()
menu_inicial.mainloop()
Pero mi botón no funciona cuando hago clic en él, solo muestra la impresión una vez en la consola cuando ejecuto el código, agregué algunas impresiones aquí en la pregunta:
Bueno, parece que cuando uso la función Lambda en el botón, funciona y realmente me gustaría saber por qué.
Lambda working button Picture one
Simplemente agregué la lambda al botón:
botao = Button(menu_inicial, text="Executar", command=lambda:comando_click("Nova_Mensagem"))
Lambda working button Picture two
¿Por qué funciona con lambda?
No debería funcionar sin lambda también, ya que lambda es básicamente una función anónima?
Estoy extremadamente curioso por entender por qué funciona, gracias a todos por la ayuda 🙂
Edit: Me gustaría agradecerles a todos, ahora finalmente entiendo qué estaba pasando y cómo funcionaba Python. Muchas gracias a todos 😀
davy.ai
La razón por la que el botón no funciona cuando se usa
command=comando_click("Nova_Mensagem")
es porque esto llamará inmediatamente a la funcióncomando_click
con el argumento “Nova_Mensagem” y devolverá lo que esa función devuelve como el comando para el botón. Esto significa que la funcióncomando_click
se llama cuando se crea el botón y no cuando se hace clic en él.Cuando se usa
command=lambda:comando_click("Nova_Mensagem")
, se está creando una función anónima (conlambda
) que llamará acomando_click("Nova_Mensagem")
cuando se haga clic en el botón. De esta manera, la funcióncomando_click
no se llama cuando se crea el botón, sino solo cuando se hace clic en él.Entonces, esencialmente, al usar
lambda
, se está creando una nueva función que se llamará como el comando para el botón, en lugar de llamar a la funcióncomando_click
con un argumento y devolver su resultado.