2011-11-25 11 views
12

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 ...¿Por qué se ejecuta el parámetro de botón "comando" cuando se declara?

>>> def Hello(): 
     print("Hi there!") 

>>> hi=Button(frame,text="Hello",command=Hello()) 
Hi there! 
>>> 

Respuesta

25

Se llama mientras que los parámetros para Button están siendo asignados:

command=Hello() 

Si desea pasar a la función (valor no se devuelve) en su lugar debe:

command=Hello 

en general function_name es un objeto función, function_name() es cualquier cosa que devuelve la función. Ver si esto ayuda aún más:

>>> def func(): 
...  return 'hello' 
... 
>>> type(func) 
<type 'function'> 
>>> type(func()) 
<type 'str'> 

Si quiere pasar argumentos, se puede utilizar un lambda expression para construir un sin parámetros exigible.

>>> hi=Button(frame, text="Hello", command=lambda: Goodnight("Moon")) 

En pocas palabras, porque es Goodnight("Moon") en una lambda, no se ejecutará de inmediato, en lugar de esperar hasta que se hace clic en el botón.

+0

Gracias! El seguimiento obvio es; ¿cómo paso argumentos? Ahora estoy leyendo sobre Lambda, parece que podría ser la respuesta. – wjakobw

+0

@wjakobw - ¿Pasa el argumento a la función o pasa la función como argumento? En el primer caso declaras argumentos en la definición de la función ex: 'def func (par1, par2):' en este último, simplemente usas el nombre de la función sin paréntesis, como lo delineé en mi respuesta. Ya que eres nuevo en python, ¿puedo sugerir [esta lectura] (http://www.diveintopython.net/)? Es fácil de seguir y muy divertido. – mac

+1

Me gustaría pasar una variable como argumento cuando se presiona el botón. El comando usual = Hello (arg) no funcionará ya que la devolución de llamada contiene parantheses y usa el valor de retorno en lugar de la función. * En el ejemplo anterior Hello-function no toma argumentos, pero imagine otro caso. – wjakobw

2

También puede utilizar una expresión lambda como el 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() 
+3

Lambda es completamente innecesario si no está pasando argumentos. Puede mejorar su respuesta mostrando cómo usar lambda para pasar argumentos. –

Cuestiones relacionadas