Почему параметр Button "command" выполняется при объявлении?
Я новичок в Python и пытаюсь написать программу с помощью tkinter. Почему ниже приведена функция Hello? Как я понимаю, обратный вызов будет выполняться только при нажатии кнопки? Я очень смущен...
>>> def Hello():
print("Hi there!")
>>> hi=Button(frame,text="Hello",command=Hello())
Hi there!
>>>
2 ответа
Он вызывается в то время как параметры для Button
присваиваются:
command=Hello()
Если вы хотите передать функцию (а не возвращаемое значение), вы должны вместо этого:
command=Hello
в общем function_name
является функциональным объектом, function_name()
это то, что возвращает функция. Посмотрим, поможет ли это дальше:
>>> def func():
... return 'hello'
...
>>> type(func)
<type 'function'>
>>> type(func())
<type 'str'>
Если вы хотите передать аргументы, вы можете использовать лямбда-выражение, чтобы создать вызываемый без параметров параметр.
>>> hi=Button(frame, text="Hello", command=lambda: Goodnight("Moon"))
Проще говоря, потому что Goodnight("Moon")
находится в лямбде, он не будет выполняться сразу, вместо этого, пока не будет нажата кнопка.
Вы также можете использовать лямбда-выражение в качестве аргумента команды:
import tkinter as tk
def hello():
print("Hi there!")
main = tk.Tk()
hi = tk.Button(main,text="Hello",command=lambda: hello()).pack()
main.mainloop()