我有一个相当简单的Python问题,我真的很难解决。
我在Tk小部件父级中有一个LabelFrame小部件。 LabelFrame包含许多小部件,包括标签,条目小部件和按钮。按下按钮后,我想执行def,但是想要将条目小部件中的用户输入发送到def进行处理。然而。当我在按钮中向命令添加任何参数时(例如command = make_new_user(entry1,entry2),该命令在运行代码时自动执行,甚至没有按下按钮。我希望命令只在按下按钮时执行,但也能够将参数发送到处理def。
有人可以帮忙吗?
谢谢, MiddleClassMan
答案 0 :(得分:1)
这就是支持它的方式 - 每当你在调用它的函数的名称之后添加括号时。仅使用其名称,您将引用函数对象。
TKinter本身不允许向回调添加参数。
通常要做的是使用“lambda”关键字创建一个“扔掉函数” - 这个扔掉的函数本身不接收任何参数 - 但它记录在自身内部 要传递给真实处理程序的参数。
所以,如果只有这个问题的话,那将是代替写作的情况:
Button(..., command=handler(par1, par2), ...)
写:
Button(..., command=(lambda: handler(par1, par2)), ...)
然而,Python的本质还有一件事阻止了它的运作 - 如果“par1”和“par2”是变量,它们的值是“实时” - 这意味着发送到Button的参数将是waterver值par1和par2,其中保持当时 单击了按钮。
避免这种情况的方法是使用lambda关键字添加另一个间接级别, 这样参数值在按钮创建时“冻结”。
为了便于阅读,最好用两行代替它,而不是内联它 在按钮创建调用中:
command = (lambda p1, p2: lambda: handler(p1, p2)) (par1, par2)
Button = (..., command=command, ... )
这样做,变量“command”将包含一个丢弃函数 其中变量“p1”和“p2”的瞬时值为“par1”和“par2”