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