我的代码是:
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)
命令选项引用一个函数,这是一种奇特的方式,表示你需要传递函数的名称.要传递引用,您必须仅使用名称,而不使用括号或参数.例如:
b = Button(... command = button)
如果你想传递一个参数,如“嘿”,你必须使用一些额外的代码:
>你可以创建一个中间函数,可以在没有你的参数的情况下调用,然后调用你的按钮函数,
>您可以使用lambda创建所谓的匿名函数.在任何方面它都是一个功能,除了它没有名称.当您调用lambda命令时,它返回对创建函数的引用,这意味着它可以用于按钮的命令选项的值.
>你可以使用functools.partial
对我来说,lambda是最简单的,因为它不需要像functools.partial这样的任何其他导入,尽管有些人认为functools.partial更容易理解.
要创建一个使用参数调用按钮函数的lambda函数,您可以执行以下操作:
lambda: button('hey')
您最终得到的功能在功能上等同于:
def some_name():
button('hey')
正如我之前所说,lambda返回对这个无名函数的引用.由于引用是命令选项所期望的,因此您可以在创建按钮时直接使用lambda:
b = Button(... command = lambda: button('hey'))
最后,请参阅标题为Tkinter Callbacks on effbot.org的部分以获得一个很好的教程. lambda的覆盖范围非常精简,但那里的信息可能仍然有用.
标签:python,tkinter
来源: https://codeday.me/bug/20190910/1802087.html