Kivy - Property
Property 是 Kivy 中的一个特殊类,它允许您定义和管理小部件或对象的属性。属性类在"kivy.properties"模块中定义。您可以跟踪这些属性的更改,它们允许您绑定要在属性更改时执行的回调函数。
Kivy 的属性类支持以下功能 −
值检查/验证
每当为属性分配新值时,都会根据验证约束进行检查,以防止出现错误。例如,OptionProperty 的验证将确保该值在预定义的可能性列表中。NumericProperty 的验证将检查您的值是否为数字类型。
观察者模式
您可以指定当属性值更改时应该发生什么。您可以将自己的函数绑定为对属性更改的回调。例如,如果您希望在小部件的 pos 属性发生更改时调用一段代码,则可以将函数绑定到它。
更好的内存管理
属性的同一实例在多个小部件实例之间共享。
可能需要注意的是,Property 对象与 Python 中的 property() 内置函数不同。
属性对象必须在类级别声明,而不是在类的任何方法中声明。
每个属性默认提供一个"on_<propertyname>"事件,每当属性的状态/值发生变化时都会调用该事件。
示例
让我们通过以下示例研究 Kivy 中 Property 的行为。App 类具有 NumericProperty 属性。 NumericProperty 对象(值)绑定到 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() 方法并将值增加 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"开始增加的数字。
以下是示例的完整代码 −
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 提供以下属性类型 −
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 的字符串
表示颜色名称的字符串(例如"红色"、"黄色"、"绿色")