【问题标题】:Why is Button parameter "command" executed when declared? [duplicate]为什么声明时会执行Button参数“命令”? [复制]
【发布时间】:2012-01-06 07:59:57
【问题描述】:

我是 Python 新手,正在尝试使用 tkinter 编写程序。 为什么会执行下面的 Hello-function?据我了解,回调只会在按下按钮时执行?我很困惑……

>>> def Hello():
        print("Hi there!")

>>> hi=Button(frame,text="Hello",command=Hello())
Hi there!
>>> 

【问题讨论】:

    标签: python callback tkinter


    【解决方案1】:

    在分配Button 的参数时调用它:

    command=Hello()
    

    如果你想传递函数(不是它的返回值),你应该改为:

    command=Hello
    

    一般function_name 是一个函数对象,function_name() 是函数返回的任何内容。看看这是否有帮助:

    >>> def func():
    ...     return 'hello'
    ... 
    >>> type(func)
    <type 'function'>
    >>> type(func())
    <type 'str'>
    

    如果要传递参数,可以使用lambda expression 构造无参数可调用对象。

    >>> hi=Button(frame, text="Hello", command=lambda: Goodnight("Moon"))
    

    简单地说,因为Goodnight("Moon")在一个lambda中,它不会立即执行,而是等到按钮被点击。

    【讨论】:

    • 谢谢!明显的后续行动是;我如何传递论点?我现在正在阅读有关 Lambda 的信息,看来这可能就是答案。
    • @wjakobw - 将参数传递给函数或将函数作为参数传递?在第一种情况下,您在函数定义中声明参数 ex:def func(par1, par2): 在后者中,您只需使用不带括号的函数名称,正如我在回答中概述的那样。既然你是 python 的新手,我可以建议this reading 吗?它很容易上手,而且非常有趣。
    • 我想在按下按钮时传递一个变量作为参数。通常的方式 command=Hello(arg) 将不起作用,因为回调然后包含括号并使用返回值而不是函数。 *在上面的例子中,Hello-function 没有参数,但想象一下其他情况。
    • @wjakobw - python 中使用的常规模式之一是传递对象列表,其中第一个是函数,其他是它的参数(请参阅@987654323 中调用子进程的方式@ 模块,例如)。如果这不是一个选项,您可能想要的是使用closures。一篇关于他们在 python 中实现的好文章是this one
    【解决方案2】:

    您也可以使用 lambda 表达式作为命令参数:

    import tkinter as tk
    def hello():
        print("Hi there!")
    
    main = tk.Tk()
    hi = tk.Button(main,text="Hello",command=lambda: hello()).pack()
    main.mainloop()
    

    【讨论】:

    • 如果您不传递参数,Lambda 是完全没有必要的。您可以通过展示如何使用 lambda 传递参数来改进您的答案。
    猜你喜欢
    • 2017-07-27
    • 2018-09-16
    • 2022-11-19
    • 2016-06-10
    • 2022-01-10
    相关资源
    最近更新 更多