Kivy 简明教程
Kivy - Properties
Property 是 Kivy 中的一个特殊类,允许您定义和管理微调器或对象的属性。Property 类在“kivy.properties”模块中定义。您可以跟踪对这些属性的更改,并且它们允许您绑定将在属性更改时执行的回调函数。
Kivy 的属性类支持以下特性−
Value Checking / Validation
每当将新值指定给某个属性时,系统会根据验证约束检查该值,以防止错误。例如,OptionProperty 的验证将确保该值位于预定义的可能性列表中。NumericProperty 的验证将检查您的值是否属于数字类型。
Observer Pattern
您可以指定某个属性值发生更改时应采取哪些措施。您可以将自己的函数作为回调绑定到某个 Property 的更改。例如,如果您希望在微调器的 pos 属性更改时调用一段代码,则可以向其绑定一个函数。
Better Memory Management
一个属性的同一实例在多个微调器实例中共享。
-
值得注意的是,Property 对象与 Python 中的 property() 内置函数不同。
-
必须在类级别声明一个属性对象,而不是在类中的任何方法中。
-
每个属性在默认情况下提供一个“on_<属性名>”事件,该事件在属性的状态/值更改时被调用。
Example
让我们通过以下示例研究 Kivy 中 Property 的行为。App 类具有 NumericProperty 属性。NumericProperty 对象(value)绑定到 on_value_change() 方法。
class NumPropApp(App):
value = NumericProperty(0)
def on_value_change(self, instance, value):
print(f"Value changed: {value}")
self.l1.text = str(value)
在 build() 方法中,应用程序在一个垂直 BoxLayout 中组装了一个标签和一个按钮。针对 on_press 事件,按钮调用 onstart() 方法,并将值增加 1。
def onstart(self, event):
print ("started")
self.value = self.value+1
def build(self):
lo = BoxLayout(orientation='vertical')
self.l1 = Label(text=str(self.value), font_size = 50)
self.b1 = Button(text = "start", font_size = 50)
self.b1.bind(on_press=self.onstart)
self.bind(value=self.on_value_change)
lo.add_widget(self.l1)
lo.add_widget(self.b1)
return lo
由于在每次更改值时都会调用“on_value_change()”方法,因此效果是,在每次按下按钮时,该标签标题都会从“0”开始显示增加的编号。
以下是本例的 complete code −
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.properties import NumericProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.config import Config
# Configuration
Config.set('graphics', 'width', '720')
Config.set('graphics', 'height', '400')
Config.set('graphics', 'resizable', '1')
class NumPropApp(App):
value = NumericProperty(0)
def on_value_change(self, instance, value):
print(f"Value changed: {value}")
self.l1.text = str(value)
def onstart(self, event):
print ("started")
self.value = self.value+1
def build(self):
lo = BoxLayout(orientation='vertical')
self.l1 = Label(text=str(self.value), font_size = 50)
self.b1 = Button(text = "start", font_size = 50)
self.b1.bind(on_press=self.onstart)
self.bind(value=self.on_value_change)
lo.add_widget(self.l1)
lo.add_widget(self.b1)
return lo
if __name__ == '__main__':
NumPropApp().run()
Property Types
Kivy 提供以下 Property 类型 −
NumericProperty − 处理数字值,例如整数和小数。它仅接受 int 或 float 数字数据类型或可转换为数字的字符串。
count = NumericProperty(0)
StringProperty − 用于处理字符串值。可以使用“defaultvalue”参数对其进行初始化。
text = StringProperty("start")
BoundedNumericProperty − 此属性与 NumericProperty 类似,但允许您为值定义最小值和最大值边界。它还支持 get_min() 和 get_max() 方法,它们分别返回最小和最大可接受值。
a = BoundedNumericProperty(1, min=0, max=100)
BooleanProperty − 处理布尔值(True 或 False)。defaultvalue 参数可以设置为 True 或 False。
active = BooleanProperty(False)
ListProperty − 此属性的值为 List 对象。当将列表分配给 ListProperty 时,存储在该属性中的列表是该列表的浅表副本,而不是原始列表。
colors = ListProperty([1, 0, 0, 1])
ObjectProperty − 处理单个对象实例。如果 rebind 参数设置为 True,则当任何中间属性更改时,将重新评估关联的 kv 规则,并且所有属性将被重新绑定。
person = ObjectProperty(None)
OptionProperty − 指定属性的默认值。它应该是 Options 参数中给出的列表中的一个。示例 −
state = OptionProperty("None", options=["On", "Off", "None"])
ReferenceListProperty − 此属性用于引用其他类型的多个属性对象。
x = NumericProperty(0)
y = NumericProperty(0)
z = ReferenceListProperty(x, y)
更改“z”的值会自动相应地更改“x”和“y”的值。如果您读取“z”的值,它将返回一个包含“x”和“y”值元组。
AliasProperty − 为现有属性提供别名或备用名称。
def _get_width(self):
return self.size
def _set_width(self, value):
self.size = value
width = AliasProperty(_get_width, _set_width)
DictProperty − 用于定义具有多个参数的对象的初始值,因为这些参数是字典键。
params = DictProperty({
'xlog': False,
'xmin': 0,
'xmax': 100,
'ylog': False,
'ymin': 0,
'ymax': 100,
'size': (0, 0, 0, 0)
})
VariableListProperty − 列出项,并将其扩展到所需列表大小。
obj = VariableListProperty(defaultvalue, length)
defaultvalue 参数指定了列表的默认值。length 参数是一个 int,为 2 或 4。
ConfigParserProperty — ConfigParserProperty 可让你根据其他 kivy 属性自动侦听和更改指定键的值。
ConfigParserProperty(defaultvalue, section, key, config)
ConfigParser 由节组成,每个节都有很多键和值与这些键关联。
username = ConfigParserProperty('', 'info', 'name', None)
ColorProperty — 处理各种格式的颜色值,例如 RGB 或十六进制。可为该属性分配以下任何值:
-
一个在 0-1 之间包含 3 或 4 个浮点值的集合(kivy 默认值)
-
格式为 #rrggbb 或 #rrggbbaa 的字符串
-
一个表示颜色的字符串(例如,“red”、“yellow”,“green”)