我无法在初始化时或通过调用事件将任何参数传递给guizero小部件调用的带有“命令”属性的函数。
这按预期方式工作(未传递任何参数):
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()
我想念什么?
谢谢!
答案 0 :(得分:1)
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函数。稍后将以command()
的形式调用lambda函数。
答案 1 :(得分:1)
在所有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))
答案 2 :(得分:0)
我找到了解决方法!
使用 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”,而不是之前。
感谢所有其他答案!