Kivy 简明教程

Kivy - Properties

Property 是 Kivy 中的一个特殊类,允许您定义和管理微调器或对象的属性。Property 类在“kivy.properties”模块中定义。您可以跟踪对这些属性的更改,并且它们允许您绑定将在属性更改时执行的回调函数。

Kivy 的属性类支持以下特性−

Value Checking / Validation

每当将新值指定给某个属性时,系统会根据验证约束检查该值,以防止错误。例如,OptionProperty 的验证将确保该值位于预定义的可能性列表中。NumericProperty 的验证将检查您的值是否属于数字类型。

Observer Pattern

您可以指定某个属性值发生更改时应采取哪些措施。您可以将自己的函数作为回调绑定到某个 Property 的更改。例如,如果您希望在微调器的 pos 属性更改时调用一段代码,则可以向其绑定一个函数。

Better Memory Management

一个属性的同一实例在多个微调器实例中共享。

  1. 值得注意的是,Property 对象与 Python 中的 property() 内置函数不同。

  2. 必须在类级别声明一个属性对象,而不是在类中的任何方法中。

  3. 每个属性在默认情况下提供一个“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()

Output

从命令行运行程序。按下按钮,查看该标签上显示的数字每次都会增加。

kivy properties

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 或十六进制。可为该属性分配以下任何值:

  1. 一个在 0-1 之间包含 3 或 4 个浮点值的集合(kivy 默认值)

  2. 格式为 #rrggbb 或 #rrggbbaa 的字符串

  3. 一个表示颜色的字符串(例如,“red”、“yellow”,“green”)