Почему параметр 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()
Другие вопросы по тегам