es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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:

Problem Picture one

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 😀

Tags:  , , , ,

Answer

  1. Avatar for 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ón comando_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ón comando_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 (con lambda) que llamará a comando_click("Nova_Mensagem") cuando se haga clic en el botón. De esta manera, la función comando_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ón comando_click con un argumento y devolver su resultado.

Comments are closed.