首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将参数从guizero对象传递给函数?

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

Stack Overflow用户
提问于 2019-05-12 00:01:16
回答 3查看 1.6K关注 0票数 2

我无法将任何参数传递给由guizero小部件调用的函数,无论是在初始化时使用属性“命令”,还是通过调用事件。

这与预期的一样工作(没有传递参数):

代码语言:javascript
复制
from guizero import App, PushButton

def go():
    print (10)

app = App(title="Test")
button = PushButton(app, text = "Click Here", command = go)

app.display()

但以下内容只打印数字10 一次,在单击按钮之前,然后当我单击时,什么都不会发生。

代码语言:javascript
复制
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()

我得到的结果与此相同:

代码语言:javascript
复制
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()

我遗漏了什么?

提前感谢!

EN

回答 3

Stack Overflow用户

发布于 2019-05-12 00:19:19

代码语言:javascript
复制
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函数。

票数 4
EN

Stack Overflow用户

发布于 2019-05-12 00:19:30

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

如果您使用go(10),那么它就会使用

代码语言:javascript
复制
result = go(10)
PushButton( ...., command=result)

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

您必须创建无需()即可运行的新函数。

代码语言:javascript
复制
def go_10():
    go(10)

PushButton( ...., command=go_10)

也可以使用lambda直接在command=中创建函数。

代码语言:javascript
复制
PushButton( ...., command=lambda:go(10))
票数 1
EN

Stack Overflow用户

发布于 2019-05-21 15:00:19

我找到解决办法了!

使用lambda函数是绕过回调限制的一种聪明方法,但我找到了一种通过使用小部件属性(双关不打算)向函数传递参数的更恰当的方法。结果,我忽略了对属性args的一个非常简短的引用,该属性可以在实例化时设置,并用于将列表传递给由命令调用的函数。

所以我的解决方案是:

代码语言:javascript
复制
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”,而不是在此之前。

感谢所有其他的答案!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56095177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档