Kivy 教程

Kivy - 主页

Kivy 基础知识

Kivy - 入门 Kivy - 安装 Kivy - 架构 Kivy - 文件语法 Kivy - 应用程序 Kivy - Hello World Kivy - 应用生命周期 Kivy - 事件 Kivy - 属性 Kivy - 输入 Kivy - 行为

Kivy 按钮

Kivy - 按钮 Kivy - 按钮事件 Kivy - 按钮颜色 Kivy - 按钮大小 Kivy - 按钮位置 Kivy - 圆形按钮 Kivy - 禁用按钮 Kivy - 图片按钮

Kivy 小部件

Kivy -小部件 Kivy - 标签 Kivy - 文本输入 Kivy - 画布 Kivy - 线条 Kivy - 复选框 Kivy - 下拉列表 Kivy - 窗口 Kivy - ScrollView Kivy - 轮播 Kivy - 滑块 Kivy - 图像 Kivy - 弹出窗口 Kivy - 开关 Kivy - 旋转器 Kivy - 拆分器 Kivy - 进度条 Kivy - 气泡 Kivy - 选项卡式面板 Kivy - 散点图 Kivy - 手风琴 Kivy - 文件选择器 Kivy - 颜色选择器 Kivy - 代码输入 Kivy - 模态视图 Kivy - 切换按钮 Kivy - 相机 Kivy - 树形视图 Kivy - reStructuredText Kivy - 操作栏 Kivy - 视频播放器 Kivy - 模板视图 Kivy - VKeyboard Kivy - 触摸涟漪 Kivy - 音频 Kivy - 视频 Kivy - 拼写 Kivy - 效果 Kivy - 输入记录器 Kivy - OpenGL Kivy - 文本 Kivy - 文本标记 Kivy - 设置

Kivy 布局

Kivy - 布局 Kivy - 浮动布局 Kivy - 网格布局 Kivy - 框布局 Kivy - 堆栈布局 Kivy - 锚点布局 Kivy - 相对布局 Kivy - 页面布局 Kivy - 循环布局 Kivy - 布局中的布局

Kivy 高级概念

Kivy - 配置对象 Kivy - Atlas Kivy - 数据加载器 Kivy - 缓存管理器 Kivy - 控制台 Kivy - 动画 Kivy - MultiStroke Kivy - 时钟 Kivy - SVG Kivy - UrlRequest Kivy - 剪贴板 Kivy - 工厂 Kivy - 手势 Kivy - 语言 Kivy - 图形 Kivy - 绘图 Kivy - 打包 Kivy - Garden Kivy - 存储 Kivy - 矢量 Kivy - Utils Kivy - Inspector 工具 Kivy - 工具 Kivy - 日志 Kivy - 帧缓冲区

Kivy 应用程序和项目

Kivy - 绘图应用程序 Kivy - 计算器应用程序 Kivy - 秒表应用程序 Kivy - 相机处理 Kivy - 图像查看器 Kivy - 贝塞尔曲线 Kivy - 画布应力 Kivy - 圆形绘制 Kivy - 小部件动画 Kivy - 杂项

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 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 参数是一个 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 的字符串

  • 表示颜色名称的字符串(例如"红色"、"黄色"、"绿色")