我刚开始使用第一个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'仅在程序启动时被打印一次,但是当单击按钮时不再发生任何事情。为什么?
谢谢!
答案 0 :(得分:3)
添加括号时,您调用函数(立即打印“ hello”),并将其返回值(而不是函数本身)用作回调。
None
的返回值是有效的回调,表明Button
没有 回调函数。如果say_hello
返回了一个int
,则当您单击按钮时,可能会收到错误消息,表示int
不是可调用的值。
答案 1 :(得分:1)
say_hello
是功能。在第一种情况下,您将其作为参数提供,说“这里的按钮是她的功能say_hello
。按下时执行(调用)此功能”。
第二种情况—如果要在函数后写括号,则为函数调用。因此,您没有为按钮提供以后要调用的东西,而是提供了原始价值。
整体回调的概念-您为对象(您的情况下为say_hello
)提供可调用的内容(您的情况下为函数Button
),以便对象可以回调将来,当它决定这样做时(按您的情况,当按下时)