Подтвердить что ты не робот

Почему параметр Button "команда" выполняется при объявлении?

Я новичок в Python и пытаюсь написать программу с tkinter. Почему выполняется функция Hello после выполнения? Насколько я понимаю, обратный вызов будет выполняться только при нажатии кнопки? Я очень смущен...

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

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

Ответ 1

Он вызывается, когда назначаются параметры для 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") находится в лямбда, он не будет выполняться сразу, вместо этого будет ждать нажатия кнопки.

Ответ 2

Вы также можете использовать выражение лямбда в качестве аргумента команды:

import tkinter as tk
def hello():
    print("Hi there!")

main = tk.Tk()
hi = tk.Button(main,text="Hello",command=lambda: hello()).pack()
main.mainloop()