繁体   English   中英

在Kivy中使用按钮/事件返回数据的最佳方法

[英]Best way to return data with buttons/events in Kivy

我有一个功能

 def myfunc():
     sum = 2+2 #4
     widget = Button(id="sumButton", text="Normal binding to a property change")
     widget.bind(state=self.callback)

回调函数:

def callback(self, eventObjetct):
    print "id: ", eventObject.id

这将打印:

id:sumButton

如何将sum返回到回调?

您可能不希望使用on_state属性更改将sum传递给回调方法,因为回调方法将被调用两次-一次在您按下按钮时,一次在释放按钮时。 因此,您要对lambda函数使用on_press或on_release事件,以将sum传递给回调方法。

最好的方法取决于要传递给该方法的项目数。 下面的示例说明了两种可能性-lambda和部分函数。

重载方法__init__

def __init__(self, **kwargs):
    super(DemoBox, self).__init__(**kwargs)

我们重载了方法__init __(),以便添加小部件并定义其行为。 为了实现重载的原始类的功能,请不要忘记调用super。 还要注意,优良作法是在调用super时不要忽略** kwarg,因为它们有时在内部使用。

通过运行__init__,我们传递了** kwargs对象层次结构,并重新定义了__init__,这通常会运行父类的初始化。 super用于允许我们传递** kwargs并运行父__init__,而无需显式调用父类。 在这种情况下,BoxLayout从Layout继承; 没有超级调用,您将覆盖父类。

main.py

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from functools import partial


class DemoBox(BoxLayout):

    def __init__(self, **kwargs):
        super(DemoBox, self).__init__(**kwargs)
        self.orientation = "vertical"
        self.myFunc()

    def myFunc(self):
        sum = 2 + 2
        btn1 = Button(id="summButton", text="Normal binding to a property change")
        btn1.bind(state=partial(self.callback, x=sum))
        btn2 = Button(text="Bind on_press/on_release event")
        btn2.bind(on_press=lambda x: self.on_press(x=sum))
        self.add_widget(btn1)
        self.add_widget(btn2)

    def callback(self, obj, value, x):
        print("callback: x=", x)

    def on_press(self, x):
        print("on_press: x=", x)


class TestApp(App):
    title = "Kivy Passing Arguments to Method - Using Lambda & Partial Functions"

    def build(self):
        return DemoBox()


if __name__ == "__main__":
    TestApp().run()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM