如何将参数从guizero对象传递给函数?

时间:2019-05-12 00:01:17

标签: python function user-interface parameters event-handling

我无法在初始化时或通过调用事件将任何参数传递给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()

我想念什么?

谢谢!

3 个答案:

答案 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”,而不是之前。

感谢所有其他答案!