如何在Kivy中创建惰性属性?

时间:2016-04-27 23:19:22

标签: python kivy

假设我有一个包含三个字段的课程,absum。第三个应始终等于ab的总和。

在纯Python中,这可以简单地实现为:

class MyClass(object):
    def __init__(self, a, b):
        self.a = a
        self.b = b

    @property
    def sum(self):
        return self.a + self.b

然而,在Kivy,我们鼓励使用框架的属性描述符。在包括sum之前,该课程将是:

class MyClass(Widget):
    a = NumericProperty()
    b = NumericProperty()

    def __init__(self, a, b, **kwargs):
        super(MyClass, self).__init__(**kwargs)
        self.a = a
        self.b = b

但是,我应该如何实现sum属性?我可以用一个好的ol' @property。但我不应该使用某种Kivy Property对象吗?

Kivy实现这一目标的最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

通常,属性可以帮助您在小部件上显示类字段的内容。您可以使用它们,也可以不使用它们。

您可以使用@property,并在某个窗口小部件中创建update_sum(..)方法,在按下按钮时将新总和重写为标签。

或者您可以通过创建alias property自动执行此操作,每次更改总和时更新标签,这样您就不必点击任何按钮进行更新。

main.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import NumericProperty, AliasProperty


class RootBox(BoxLayout):

    a = NumericProperty()
    b = NumericProperty()

    def get_sum(self):
        return float(self.a + self.b)

    def set_sum(self, value):
        self.sum = value

    sum = AliasProperty(get_sum, set_sum, bind=['a', 'b'])

    def on_sum(self, obj, value):
        self.ids.sum_label.text = str(value)


class Test(App):
    pass


Test().run()

test.kv

RootBox:
    orientation: 'vertical'

    Label:
        id: sum_label

    BoxLayout:
        orientation: 'vertical'

        TextInput:
            on_text: root.a = float(self.text) if self.text else 0
        TextInput:
            on_text: root.b = float(self.text) if self.text else 0