事件绑定中的函数回调,不带括号

时间:2019-01-29 12:25:13

标签: python tkinter

我刚开始使用第一个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 :(得分:3)

添加括号时,您调用函数(立即打印“ hello”),并将其返回值(而不是函数本身)用作回调。

None的返回值是有效的回调,表明Button没有 回调函数。如果say_hello返回了一个int,则当您单击按钮时,可能会收到错误消息,表示int不是可调用的值。

答案 1 :(得分:1)

say_hello是功能。在第一种情况下,您将其作为参数提供,说“这里的按钮是她的功能say_hello。按下时执行(调用)此功能”。

第二种情况—如果要在函数后写括号,则为函数调用。因此,您没有为按钮提供以后要调用的东西,而是提供了原始价值。

整体回调的概念-您为对象(您的情况下为say_hello)提供可调用的内容(您的情况下为函数Button),以便对象可以回调将来,当它决定这样做时(按您的情况,当按下时)