Python中为什么在声明时执行Button参数“ command”?
代码是:
from Tkinter import *admin = Tk()
def button(an):
print an
print 'het'
b = Button(admin, text='as', command=button('hey'))
b.pack()
mainloop()
该按钮不起作用,它在没有我的命令的情况下打印了“hey”和“ het”一次,然后,当我按下按钮时,什么也没发生。
回答:
考虑以下代码:
b = Button(admin, text='as', command=button('hey'))
它的功能与此完全相同:
result = button('hey')b = button(admin, text='as', command=result)
该command
选项引用了一个函数,这是你需要向其传递函数名称的一种奇特的方式。要传递引用,你必须仅使用名称,而不使用括号或参数。例如:
b = Button(... command = button)
如果要传递诸如“her”之类的参数,则必须使用一些额外的代码:
- 你可以创建一个无需你的参数即可调用的中间函数,然后再调用你的
button
函数, - 你可以
lambda
用来创建所谓的匿名函数。在各种方面,它都是一个函数,但没有名称。当你调用lambda
命令时,它返回对创建的函数的引用,这意味着它可以用作command按钮选项的值。 - 你可以使用
functools.partial
对我来说,这
lambda
是最简单的,因为它不需要像functools.partial
这样的任何其他导入,尽管有些人认为这functools.partial
更容易理解。
要创建一个button使用参数调用你的函数的lambda函数,你可以执行以下操作:
lambda: button('hey')
你最终得到的功能在功能上等同于:
def some_name(): button('hey')
如前所述,lambda返回对该无名函数的引用。由于参考是该command选项所期望的,因此你可以lambda直接在按钮的创建中使用它:
b = Button(... command = lambda: button('hey'))
以上是 Python中为什么在声明时执行Button参数“ command”? 的全部内容, 来源链接: utcz.com/qa/434073.html