【问题标题】:Understanding function call for tkinter button command了解 tkinter 按钮命令的函数调用
【发布时间】:2021-07-30 08:55:46
【问题描述】:

我正在学习关于 tkinter 的教程。我修改了一些代码,想法是每次您单击按钮时,我们都会在下面的行中创建一个新的文本标签。令我困惑的是,当我写 command=click 时它可以工作,但是当我写 command = click() 时,该函数在脚本开头执行一次,但在按下按钮时不执行。第一个行为如我所料。第二种行为让我感到困惑,因为我希望它会引发错误,如果不按下按钮就不会执行该功能。

from tkinter import *

root = Tk()


position = {"Loc":1}
def click(position=position):
    Label(root, text="ta").grid(row=position["Loc"], column=0)
    position["Loc"] = position["Loc"] + 1
    return

but = Button(root, text="click here to do nothing",command=click())
but.grid(row=0,column=0)



root.mainloop()

注意:我发现下面的答案比相关问题 here 的答案更有帮助,因为它明确表示在传递给函数之前首先评估参数。

【问题讨论】:

  • 部分 - 但它似乎并不能解释为什么会发生某些事情而不是错误。即,命令期望接收对函数的引用,但实际上设置为等于函数的返回值。
  • @ClownDown 问题现已编辑。首先评估参数变量的解释(虽然事后看来很明显)在另一个问题中并不明确

标签: python tkinter


【解决方案1】:

当你在 Python 中运行一个函数时(比如but = Button(root, text="click here to do nothing",command=click())),首先所有的参数都会被计算然后传递给函数。因此,您正在调用click(),然后将其返回值分配给命令。如果它返回 None 或 Button 可以处理的其他内容,您将不会收到任何错误。当您只传递click 时,您实际上是在告诉函数它应该在您单击按钮时调用该函数。

一些简单的代码来澄清这个问题:

def foo(bar):
    print("\tCalling function {} from foo".format(bar))
    if bar:
        bar()

def fun():
    print("\tExecuting fun function")


print("\nPassing function")
foo(fun)

print("\nPassing function return value")
foo(fun())

如果您查看输出,您会注意到它们以不同的顺序执行 - 在第二种情况下,首先执行 fun,返回 None,然后将 None 值作为 bar 参数提供给 foo。

Passing function
    Calling function <function fun at 0x000001A79F8863A0> from foo
    Executing fun function

Passing function return value
    Executing fun function
    Calling function None from foo

至于为什么没有错误 - 为什么会有? 两者都是有效的陈述。你可以有一个返回其他函数的函数,并以这种方式将它传递给按钮。

【讨论】:

    猜你喜欢
    • 2018-06-10
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 2023-02-24
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    相关资源
    最近更新 更多