Tkinter菜单命令如何针对带参数的函数?

7

我想知道如何制作一个针对带参数函数的Tkinter菜单(使用Python),例如 foo("what")

def foo(arg):
    print "Foo, %s." % arg

popup = Menu()
popup.add_command(label="Spam!", command=foo("spam")) # Doesn't work.
popup.add_command(label="Turkey!", command=foo("turkey")) # Doesn't work.
popup.post(50, 50)
2个回答

13

命令需要将函数作为参数,但是foo("spam")给出了使用参数"spam"调用foo时的返回值。解决方法是使用一个匿名函数,该函数将foo("spam")作为参数调用:

command=lambda: foo("spam")

7

对于这类东西,尤其是事件处理程序和命令,一种优雅的解决方案是使用 functools 模块的 partial() 方法。

from functools import partial
...
command=partial(foo, "spam")

部分函数在速度上比使用lambda更快:functools.partial和类似的lambda之间的区别是什么?


这种方法似乎是唯一可行的,当我们有一个迭代变量而不是“垃圾邮件”时。例如,使用lambda无法使用for elem in list : ... command=partial(foo, elem) - logi-kal
1
@horcrux 你可以在循环内部使用lambda,但是你需要将当前循环值绑定到lambda的关键字参数中。请参见https://dev59.com/Z2Mm5IYBdhLWcg3wX98W#17677768。 - fhdrsdg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接