Обратный вызов функции в привязке событий, без и без скобок - PullRequest
0 голосов
/ 29 января 2019

Я только начал свою первую программу на Python и столкнулся с довольно странной проблемой с обратным вызовом функции.Вот код, который соответствует моим ожиданиям:

from tkinter import *

def say_hello():
    print('hello')

root = Tk()
Button(root, text='say hello', command=say_hello).pack()
root.mainloop()

Теперь, если я добавлю скобки к имени функции, то

Button(root, text='say hello', command=say_hello()).pack()

'hello' будет напечатано только один раз при запуске программы, нобольше ничего не происходит при нажатии кнопки.Зачем?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 января 2019

say_hello является функцией.В 1-м случае вы предоставляете это в качестве аргумента, говоря: «Вот кнопка, ее функция say_hello. Выполните (вызов) эту функцию, когда вы нажали».

2-й случай - если вы пишете скобкипосле функции это вызов функции.Таким образом, вы не предоставляете своей кнопке что-то для последующего вызова, а вместо этого даете необработанное значение.

Идея обратных вызовов в целом - вы предоставляете объекту возможность вызова (функция say_hello в вашем случае) для объекта (* 1008)* в вашем случае), чтобы объект мог перезвонить в будущем, когда он решит это сделать (в вашем случае, когда нажата)

0 голосов
/ 29 января 2019

Когда вы добавляете круглые скобки, вы вызываете функцию (немедленно выводящую «hello»), и ее возвращаемое значение (не сама функция) используется в качестве обратного вызова.

Возвратзначение None является допустимым обратным вызовом, указывающим, что равен функции обратного вызова для Button.Если say_hello вернул, скажем, int, вы, вероятно, получите ошибку, когда нажмете кнопку, и скажете, что int не является вызываемым значением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...