【问题标题】:How do I pass parameters to a function from a guizero object?如何将参数从 guizero 对象传递给函数?
【发布时间】:2019-05-12 00:01:16
【问题描述】:

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

这按预期工作(未传递参数):

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()

我错过了什么?

提前致谢!

【问题讨论】:

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


    【解决方案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() 最终应该调用declared 匿名 lambda 函数,当调用该 lambda 函数时,它本身会调用go(10)。您是在声明一个匿名 lambda 函数,而不是调用它。 lambda 函数稍后将作为command() 调用。

    【讨论】:

      【解决方案2】:

      在所有 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))
      

      【讨论】:

        【解决方案3】:

        我找到了解决办法!

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

        感谢所有其他答案!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-12-31
          • 2013-09-21
          • 1970-01-01
          • 2019-11-09
          • 2018-09-09
          • 2010-10-16
          • 1970-01-01
          相关资源
          最近更新 更多