也就是说它是如何supposd是 - ?当你添加后的括号是你调用它的一个函数的名字,只使用它的名字,就是引用该函数对象
TKinter本身不允许向参数添加回调。
通常要做的事情是建立一个“扔掉功能”,使用“拉姆达”关键字 - 此扔掉函数接收任何参数本身 - 但它记录里面本身 参数要传承给你真正的处理者。
所以,如果身在何处,只有如此,这将是代替书面情况:
Button(..., command=handler(par1, par2), ...)
写:
Button(..., command=(lambda: handler(par1, par2)), ...)
然而,有一件事在如果“par1”和“par2”是变量,则它们的值是“live” - 这意味着发送到Button的参数将是watherver值p ar1和par2在按下按钮时按住。
避免这种情况的方法是使用lambda关键字 添加另一个间接级别,以便在创建按钮时将参数值“冻结”。
对于readbility的缘故,一个更好的做到这一点的2线,而不是内联它 在按钮创建调用:
command = (lambda p1, p2: lambda: handler(p1, p2)) (par1, par2)
Button = (..., command=command, ...)
这样做,这样,变量“命令”将包含一个扔掉功能其中变量“p1”和“p2”具有“par1”和“par2”的即时值的变量
非常感谢,我会尝试一下!这是一个常见问题吗?我只是一名自学成才的程序员,但我觉得这在Python中有点限制... – MiddleClassMan
这更多的是关于“Tkinter” - 图形工具包而不是Python。 Tkinter在Windows中捆绑了Python,但它不是唯一可供选择的图形工具包。一旦人们理解了这一点,就很容易编写一堆辅助函数来自动化这类事情。 – jsbueno