python - estructura - modelo transitorio odoo
¿Por qué se ejecuta el parámetro de botón "comando" cuando se declara? (2)
Esta pregunta ya tiene una respuesta aquí:
Soy nuevo en Python e intento escribir un programa con tkinter. ¿Por qué se ejecuta la función Hello a continuación? Según tengo entendido, la devolución de llamada solo se ejecutará cuando se presione el botón? Estoy muy confundido...
>>> def Hello():
print("Hi there!")
>>> hi=Button(frame,text="Hello",command=Hello())
Hi there!
>>>
También puede usar una expresión lambda como argumento de comando:
import tkinter as tk
def hello():
print("Hi there!")
main = tk.Tk()
hi = tk.Button(main,text="Hello",command=lambda: hello()).pack()
main.mainloop()
Se llama mientras se están asignando los parámetros para Button
:
command=Hello()
Si desea pasar la función (no es el valor devuelto), en su lugar debe:
command=Hello
en general function_name
es un objeto de función, function_name()
es lo que devuelve la función. Vea si esto ayuda aún más:
>>> def func():
... return ''hello''
...
>>> type(func)
<type ''function''>
>>> type(func())
<type ''str''>
Si desea pasar argumentos, puede usar una expresión lambda para construir un parámetro invocable.
>>> hi=Button(frame, text="Hello", command=lambda: Goodnight("Moon"))
En pocas palabras, porque Goodnight("Moon")
está en una lambda, no se ejecutará de inmediato, en lugar de esperar hasta que se haga clic en el botón.