Skip to main content
 首页 » 编程设计

python之来自 Tkinter.Button 的命令

2025年05月04日12yjmyzz

我有一个相当简单的 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”