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

Posted

技术标签:

【中文标题】在 Kivy 中使用按钮/事件返回数据的最佳方式【英文标题】:Best way to return data with buttons/events in Kivy 【发布时间】:2018-04-22 15:57:32 【问题描述】:

我有一个功能

 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 返回给回调?

【问题讨论】:

【参考方案1】:

您可能不想使用 on_state 属性更改将 sum 传递给 callback 方法,因为该方法,回调将被调用两次 - 一次你按下按钮,当你松开按钮一次。因此,您希望使用带有 lambda 函数的 on_press 或 on_release 事件将 sum 传递给回调方法。

最好的方法取决于你想传递多少项给方法。下面的示例说明了两种可能性 - lambda 和偏函数。

重载方法__init__

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

我们重载方法 __init__() 以便添加小部件并定义 他们的行为。一个人不应该忘记调用 super 以便 实现被重载的原始类的功能。 另请注意,最好不要省略 **kwargs 而 调用 super,因为它们有时在内部使用。

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

示例

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

【讨论】:

这个好,现在关键字super()如何与init函数交互? 我已经添加了关于重载方法 init 的解释

以上是关于在 Kivy 中使用按钮/事件返回数据的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

使用 MouseUp 和 MouseDown 事件或其他方式模拟单击的最佳方法是啥?

使用 python 主文件传递按钮 ID:kivy

带有kivy的android上的后退按钮功能

在 Kivy 中释放另一个按钮时添加一个新按钮

在kivy中的按钮内组合图像和文本

将事件传递给 ViewModel 的最佳方式是啥?