Kivy - 属性



属性是Kivy中一个特殊的类,允许你定义和管理小部件或对象的属性。“kivy.properties”模块中定义了Property类。你可以跟踪这些属性的变化,并且可以绑定回调函数,以便在属性改变时执行。

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

值检查/验证

每当为属性分配新值时,都会根据验证约束对其进行检查,以防止错误。例如,OptionProperty的验证将确保该值位于预定义的可能性列表中。NumericProperty的验证将检查你的值是否为数字类型。

观察者模式

你可以指定属性值改变时应该发生什么。你可以将自己的函数绑定为Property更改的回调。例如,如果你想在小部件的pos属性改变时调用一段代码,你可以将一个函数绑定到它。

更好的内存管理

同一属性实例在多个小部件实例之间共享。

  • 需要注意的是,Property对象与Python中内置的property()函数不同。

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

  • 默认情况下,每个属性都提供一个“on_”事件,每当属性的状态/值改变时都会调用该事件。

示例

让我们通过以下示例来学习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()方法中,应用程序有一个Label和一个Button,它们在一个垂直的BoxLayout中组合在一起。Button响应on_press事件调用onstart()方法,并将value加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()”方法在每次value改变时都会被调用,因此每次按下按钮时,标签标题都会显示从“0”开始递增的数字。

以下是该示例的完整代码

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

输出

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

Kivy Properties

属性类型

Kivy提供以下属性类型:

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参数是一个整数,可以是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”)

广告