为什么在声明时执行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() 

button不起作用,它会在没有我的命令的情况下打印“hey”和“het”,然后,当我按下button时,什么都不会发生。

command选项引用了一个函数,这是一种很奇怪的方式,表示你需要传递函数的名字。 当你做button('hey')你正在调用functionbutton并将其结果给予command选项

要传递引用,只能使用名称,而不能使用括号或参数。 例如:

 b = Button(... command = button) 

如果你想传递一个参数,如“嘿”,你必须使用一些额外的代码:

  • 你可以创build一个中间函数,不需要你的参数就可以调用,然后调用你的button函数,
  • 你可以使用lambda来创build被称为匿名函数的东西 。 在任何情况下,它都是一个函数,除了没有名字。 当你调用lambda命令时,它会返回一个创build函数的引用 ,这意味着它可以用作button的command选项的值。
  • 你可以使用functools.partial

对于我来说, lambda是最简单的,因为它不需要像functools.partial那样的任何额外的input,尽pipe有些人认为functools.partial更容易理解。

要创build一个使用参数调用button函数的lambda函数,可以这样做:

 lambda: button('hey') 

您最终得到的function在function上等同于:

 def some_name(): button('hey') 

正如我刚才所说, lambda返回这个无名函数的引用。 由于引用是command选项所期望的,所以可以在创buildbutton时使用lambda方向:

 b = Button(... command = lambda: button('hey')) 

总的来说,这个网站上有一个关于lambda的有趣评论。 查看问题为什么Python lambda是有用的? 。 同样的讨论有一个答案,当你需要将variables传递给callback时,如何在循环中使用lambdas 。

最后,请参阅effbot.org上标题为“ Tkintercallback”的小节,获取一个很好的教程。 lambda的覆盖面非常精简,但其中的信息可能仍然有用。

您需要创build一个不带参数的函数,您可以将其用作该命令:

 b = Button(admin, text='as', command=lambda: button('hey')) 

请参阅本文档的“传递参数到callback”部分。

button('hey')调用该函数,而不是将其设置为callback。

不要使用任何关键字或参数作为函数的input或括号。 这是非常简单的解决scheme:)