Kivy 简明教程

Kivy - Architecture

阅读本章以了解 Kivy 框架的设计架构。一方面,Kivy 提供各种微件,让用户可以与应用程序交互;另一方面,它与各种硬件设备(例如鼠标 TUIO、音频和视频流等)交互。中间层包含用于处理触摸输入、音频和视频、图形指令和文本输入的驱动程序或提供程序。

这是 Kivy 框架的官方架构图 -

kivy architecture

Core Providers

Kivy 架构的一个重要功能是“模块化”和“抽象”。打开窗口、读取音频和视频流、加载图像等操作是在任何图形应用程序中的核心任务。Kivy 通过将易于实现的 API 提供给控制硬件的驱动程序,抽象了这些核心任务。

Kivy 会对运行您应用程序的操作系统使用特定的提供商。每个操作系统(Windows、Linux、MacOS 等等)都有其自己的原生 API 来运行不同的核心任务。这些原生 API 作为操作系统一侧和 Kivy 另一侧之间的中介通信层。因此,Kivy 完全利用操作系统提供的功能来提高效率。

使用平台特定的库可以减少 Kivy 发行版的大小并简化打包。这也使 Kivy 更容易移植到其他平台。Android 移植版本受益匪浅。

Input Providers

输入提供程序是一段代码,它增加了对特定输入设备的支持。在 Kivy 中具有内置支持的不同输入设备包括:

  1. Android Joystick Input Provider

  2. Apple’s trackpads

  3. * TUIO(有形用户界面对象)

  4. mouse emulator

  5. HIDInput

要增加对新输入设备的支持,请提供一个新的类,该类可从您的设备读取输入数据并将它们转换为 Kivy 基本事件。

Graphics

OpenGL是Kivy框架的整个图形API的基础。Kivy使用OpenGL指令来发出硬件加速的绘图命令。Kivy通过定义易于使用的功能摆脱了编写OpenGL命令的困难部分。

Kivy使用OpenGL版本2.0 ES(GLES或嵌入式系统的OpenGL),您可以使用它进行跨平台开发。

Core Library

Kivy框架的以下组成部分提供了高级抽象:

  1. * Clock - Clock API 帮助您计划计时器事件。它同时支持一次性计时器和周期性计时器。

  2. * Gesture Detection - 多点触控界面的重要要求。手势识别器检测各种类型的笔触,例如圆形或矩形。您甚至可以对其进行训练以检测您自己的笔触。

  3. * Kivy Language - kivy 语言用于轻松高效地描述用户界面。这样有助于将应用程序设计与开发应用程序逻辑分离。

  4. * Properties - Kivy 的属性类(它们不同于 Python 类中的属性)这一独特的概念将您的构件代码与用户界面描述关联起来。

UIX

Kivy 的用户界面由构件和布局构建。

  1. 构件是您添加到应用程序中以提供某种功能的 UI 元素。构件的示例包括按钮、滑动条、列表等。构件接收 MotionEvents。

  2. 将多个构件放在合适的布局中。Kivy 提供的布局类可以满足为各个用途放置构件的要求。网格布局或盒子布局就是示例。您还可以嵌套布局。

Event Dispatch

术语“构件”几乎用于所有图形工具包中的 UI 元素。任何接收输入事件的对象都是一个构件。一个或多个构件被安排在树形结构中。

Kivy 应用程序窗口只能容纳一个根构件,但该根构件可以在树形结构中包含其他构件。因此,构件之间存在“父-子-兄弟”关系。

每当发生新的输入事件时,构件树的根构件会首先收到该事件。根据触碰状态,该事件会沿着构件树向下传播。

树中的每个构件都可以处理该事件或将其传递给层次结构中的下一个构件。如果一个构件吸收并处理了该事件,它应该返回 True,这样,事件在树中向下传播就会停止,并且该事件不会有进一步的处理。

def on_touch_down(self, touch):
   for child in self.children[:]:
      if child.dispatch('on_touch_down', touch):
         return True

由于该事件通过窗口小部件树传播,因此通常需要验证该事件是否发生在期望处理该事件的某个窗口小部件的区域内。collide_point() 方法有助于确定这一事实。此方法检查触摸位置是否落在某个窗口小部件的“监视区域”内,否则返回 True 或 False。默认情况下,这将检查窗口小部件的 pos (对于位置;x 和 y)和 size (宽和高)描述的屏幕上的矩形区域。