我无法将任何参数传递给由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()我遗漏了什么?
提前感谢!
发布于 2019-05-12 00:19:19
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函数。
发布于 2019-05-12 00:19:30
在所有的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))发布于 2019-05-21 15:00:19
我找到解决办法了!
使用lambda函数是绕过回调限制的一种聪明方法,但我找到了一种通过使用小部件属性(双关不打算)向函数传递参数的更恰当的方法。结果,我忽略了对属性args的一个非常简短的引用,该属性可以在实例化时设置,并用于将列表传递给由命令调用的函数。
所以我的解决方案是:
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”,而不是在此之前。
感谢所有其他的答案!
https://stackoverflow.com/questions/56095177
复制相似问题