假设我有一个包含三个字段的课程,a
,b
和sum
。第三个应始终等于a
和b
的总和。
在纯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实现这一目标的最佳做法是什么?
答案 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