我如何将参数传递到guizero对象的函数



我无法将任何参数传递给带有属性"命令"或通过调用事件的属性"命令"的guizero widget的函数。

这是按预期工作的(没有传递的参数(:

from guizero import App, PushButton
def go():
    print (10)
app = App(title="Test")
button = PushButton(app, text = "Click Here", command = go)
app.display()

但是以下打印数字10 一次,单击按钮,然后在我单击时,什么也不会发生

from guizero import App, PushButton
def go(n):
    print (n)
app = App(title="Test")
button = PushButton(app, text = "Click Here", command = go(10))
app.display()

我得到的结果相同:

from guizero import App, PushButton
def go(n):
    print (n)
app = App(title="Test")
button = PushButton(app, text = "Click Here")
button.when_clicked = go(10)
app.display()

我缺少什么?

预先感谢!

from guizero import App, PushButton
def go(n):
    print (n)
app = App(title="Test")
button = PushButton(app, text = "Click Here", command = lambda: go(10))
app.display()

每当您在任何地方编写go(10)时,都在调用函数go。您可能会认为您正在使用参数传递go,但您并不是因为go()旁边的括号在当时和那里调用该功能。如果要将函数go传递到另一个函数,并且go也应使用一些参数传递,则需要包装函数go并将包装函数传递为参数"命令"。使用lambda函数包装go(10)就是这样做的一种。

这项工作的原因是lambda函数当时并未在那里调用。您是说command()应该调用声明匿名lambda函数,当称为lambda函数时,它本身会调用 go(10)。您是声明一个匿名lambda函数,而不是调用它。Lambda功能将在稍后以command()

调用。

在所有GUI框架中command=(或类似(期望callback-这意味着没有()的函数名称,没有参数。


如果您使用go(10),则它可以

result = go(10)
PushButton( ...., command=result)

因此,它甚至在单击按钮之前执行go(10) - 并将结果分配给command=。因为go()返回None,因此您可以获得PushButton( ...., command=None),并且单击按钮时,您一无所获。


您必须创建新功能,您可以在没有()

的情况下运行该功能
def go_10():
    go(10)
PushButton( ...., command=go_10)

或者您可以使用lambda直接在command=

中创建功能
PushButton( ...., command=lambda:go(10))

我找到了解决方案!

使用 lambda 函数是一种解决回调限制的巧妙方法,但是我找到了一种更合适的方法,可以通过使用窗口小部件属性(不打算(将参数传递给函数。事实证明,我错过了对属性 args 的简短引用,该可以在实例化中设置,并用于将列表传递给 command

所以这是我的解决方案:

from guizero import App, PushButton
def go(n):
    print (n)
app = App(title="Test")
button = PushButton(app, text = "Click Here", args = [10], command = go)
app.display()

正如预期的那样,它每次单击按钮而不是之前都打印" 10"。

感谢所有其他答案!

相关内容

  • 没有找到相关文章

最新更新