我无法将任何参数传递给带有属性"命令"或通过调用事件的属性"命令"的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"。
感谢所有其他答案!