【问题标题】:Commands from Tkinter.Button来自 Tkinter.Button 的命令
【发布时间】:2012-01-10 20:03:20
【问题描述】:

我有一个相当简单的 Python 问题,我真的很难解决。

我在 Tk 小部件父级中有一个 LabelFrame 小部件。 LabelFrame 包含许多小部件,包括标签、条目小部件和按钮。按下按钮后,我想执行一个 def,但是想将条目小部件中的用户输入发送到 def 进行处理。然而。当我向按钮中的命令添加任何参数时(例如command=make_new_user(entry1,entry2),该命令在运行代码时自动执行,甚至无需按下按钮。我希望该命令仅在按下按钮时执行,还可以将参数发送给处理def。

有人可以帮忙吗?

谢谢, 中产阶级人

【问题讨论】:

    标签: python button widget


    【解决方案1】:

    这就是它的样子——每当你在调用它的函数名称后添加括号时。仅使用其名称,您正在引用函数对象。

    TKinter 本身不允许向回调添加参数。

    通常的做法是创建一个“丢弃函数”,使用“lambda”关键字 - 这个丢弃函数本身不接收参数 - 但它在自身内部记录 你想要传递给你的真实处理程序的参数。

    所以,如果事情只有这个,那就这样写吧:

    Button(..., command=handler(par1, par2), ...)

    写:

    Button(..., command=(lambda: handler(par1, par2)), ...)

    但是,Python 的本质还有另一件事阻止了它的工作 - 如果“par1”和“par2”是变量,它们的值是“live”——这意味着发送到按钮的参数将是参数值 par1 和 par2,此时保持 按钮被点击。

    避免这种情况的方法是添加另一个间接级别,使用 lambda 关键字, 以便在按钮创建时“冻结”参数值。

    为了可读性,最好在 2 行中完成,而不是内联 在按钮创建调用中:

    command = (lambda p1, p2: lambda: handler(p1, p2)) (par1, par2)
    Button = (..., command=command, ... )
    

    这样做,变量“command”将包含一个丢弃函数 其中变量“p1”和“p2”具有“par1”和“par2”的即时值

    【讨论】:

    • 非常感谢,我试试看!这是一个常见的问题吗?我只是一个自学成才的程序员,但我发现这在 Python 中有点限制......
    • 这更多的是关于“Tkinter”——图形工具包,而不是 Python。 Tkinter 在 Windows 中与 Python 捆绑在一起,但它并不是唯一可供选择的图形工具包。一旦理解了这一点,就很容易编写一堆帮助函数来自动化这类事情。
    猜你喜欢
    • 1970-01-01
    • 2018-12-29
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 2013-05-30
    相关资源
    最近更新 更多