2011-12-01 37 views
2

我有一个相当简单的Python问题,我真的很难解决。来自Tkinter.Button的命令

我在Tk窗口小部件中有一个LabelFrame小部件。 LabelFrame包含许多小部件,包括标签,条目小部件和按钮。按下按钮后,我想执行def,但是想要将输入小部件中的用户输入发送给def进行处理。然而。当我在按钮的命令中添加任何参数(例如command = make_new_user(entry1,entry2)时,该命令在运行代码时自动执行,甚至没有按下按钮,我只希望该命令在按下按钮时执行,但也能够将参数发送到处理高清

任何人都可以在这方面帮助请

感谢, MiddleClassMan

回答

1

也就是说它是如何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”的即时值的变量

+0

非常感谢,我会尝试一下!这是一个常见问题吗?我只是一名自学成才的程序员,但我觉得这在Python中有点限制... – MiddleClassMan

+0

这更多的是关于“Tkinter” - 图形工具包而不是Python。 Tkinter在Windows中捆绑了Python,但它不是唯一可供选择的图形工具包。一旦人们理解了这一点,就很容易编写一堆辅助函数来自动化这类事情。 – jsbueno