为什么在声明时执行Button参数“command”?

时间:2011-11-25 12:23:59

标签: python callback tkinter

我是Python的新手并试图用tkinter编写程序。 为什么下面的Hello函数被执行了?据我了解,回调只会在按下按钮时执行?我很困惑......

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

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

2 个答案:

答案 0 :(得分:31)

在分配Button的参数时调用它:

command=Hello()

如果你想传递函数(不是它的返回值),你应该改为:

command=Hello

通常function_name是一个函数对象,function_name()是函数返回的任何东西。看看这是否有助于进一步:

>>> def func():
...     return 'hello'
... 
>>> type(func)
<type 'function'>
>>> type(func())
<type 'str'>

如果要传递参数,可以使用lambda expression构造无参数的可调用对象。

>>> hi=Button(frame, text="Hello", command=lambda: Goodnight("Moon"))

简单地说,因为Goodnight("Moon")在lambda中,它不会立即执行,而是等到单击按钮。

答案 1 :(得分:2)

您还可以使用lambda表达式作为命令参数:

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

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