Kivy 简明教程
Kivy - Drawing
Kivy 库中的所有 GUI 窗口小部件都有一个 Canvas 属性。Canvas 是用于绘制各种对象(如矩形、椭圆等)的地方。需要注意的是,Kivy 没有一个单独的 Canvas 窗口小部件用于绘制形状。所有窗口小部件的画布共享一个公共坐标空间。
在 Kivy 中,绘图是在与任何窗口小部件相关的 Canvas 上完成的,使用顶点指令和上下文指令。
-
Vertex instructions − 用于绘制基本几何形状(如线条、矩形、椭圆等)的指令称为顶点指令。
-
Context instructions - 这些指令不绘制任何内容,但是会操控整个坐标空间,以便向其添加颜色,进行旋转、平移和缩放。
Vertex Instructions
这些指令以不同顶点对象的形式添加到 Canvas 中。顶点类在 kivy.graphics.vertex_instructions 模块中定义。如上所述,绘制指令被添加到 Canvas 的上下文中。
with self.canvas:
vertex(**args)
vertex_instructions 模块包含以下类 −
-
Bezier
-
BorderImage
-
Ellipse
-
Line
-
Mesh
-
Point
-
Quad
-
Rectangle
-
RoundedRectangle
-
SmoothLine
-
Triangle
Bezier
贝塞尔曲线由一些控制点加权,我们将其包含在指令中。在 Kivy 中,贝塞尔是顶点画布指令,它根据作为参数提供给贝塞尔构造函数的一组点绘制此曲线。
from kivy.graphics import Beizer
with self.canvas:
Beizer(**args)
Parameters
贝塞尔类中定义了以下参数 −
-
points − 格式为 (x1, y1, x2, y2…) 的点列表
-
loop − 布尔值,默认为 False,将贝塞尔曲线设置为将最后一个点连接到第一个点。
-
segments − int,默认为 180。定义绘制曲线所需的分段数。分段数越多,绘制结果越平滑。
-
dash_length − 分段长度(如果为虚线),默认为 1。
-
dash_offset − 一个分段的结束和下一个分段起始之间的距离,默认为 0。更改此值会使其变为虚线。
Ellipse
在 Kivy 框架中,Ellipse 是一个顶点指令。根据所需分段,它可以显示多边形、矩形或弧。如果 width 和 height 参数相等,则结果是一个圆。
from kivy.graphics import Ellipse
with self.canvas:
Ellipse(**args)
Parameters
在 Ellipse 类中定义了以下参数 −
-
pos − 二元素元组,提供椭圆中心的 X 和 Y 坐标值。
-
size − 二元素元组,以像素为单位定义椭圆的宽度和高度。
-
angle_start − float,默认为 0.0,指定起始角度(以度为单位)。
-
angle_end − float,默认为 360.0,指定结束角度(以度为单位)。
-
segments − 椭圆分段数。如果您有许多分段,该椭圆绘制将更加平滑。使用此属性创建具有 3 个或更多边的多边形。小于 3 的值不会被表示。
Rectangle
此顶点指令基于作为参数给出的位置和尺寸在画布上绘制一个矩形。
from kivy.graphics import Rectangle
with self.canvas:
Rectangle(**args)
Parameters
在 Rectangle 类中定义了以下参数 −
-
pos − 整数列表,指定矩形的位置,格式为 (x, y)。
-
size − 整数列表,矩形的大小,格式为 (width, height)。
绘制填充有特定颜色的矩形是为标签提供背景的推荐方法。
Example
def build(self):
widget = Widget()
with widget.canvas:
Color(0, 0, 1, 1)
Rectangle(
pos=(50, 300), size_hint=(None, None),
size=(300, 200)
)
lbl = Label(
text='Hello World', font_size=24,
pos=(Window.width / 2, 300), size=(200, 200),
color=(0, 0, 1, 1)
)
with lbl.canvas.before:
Color(1, 1, 0)
Rectangle(pos=lbl.pos, size=lbl.size)
widget.add_widget(lbl)
return widget
Line
在 Kivy 图形中,Line 是一条基本的顶点指令。Line 对象构造函数的 points 属性具有连续点的 x 和 y 坐标。Kivy 会依次绘制连接这些点的线。
from kivy.graphics import Line
with self.canvas:
Line(**args)
Parameters
在 Line 类中定义了以下参数 −
-
points —— 点列表的格式为 (x1, y1, x2, y2…)
-
dash_length —— 段的长度(如果为虚线),默认为 1。
-
dash_offset —— 段末尾与下一段开头的偏移,默认为 0。更改此项后会变成虚线。
-
dashes —— 格式为 [段长,偏移,段长,偏移,…] 的整数列表。例如,[2,4,1,6,8,2] 将创建一条线,其中第一个虚线长度为 2,然后偏移 4,然后虚线长度为 1,然后偏移 6,依此类推。
-
width —— float - 定义线的宽度,默认为 1.0。
Triangle
使用此顶点指令时,Kivy 用点列表绘制三角形。
from kivy.graphics import Triangle
with self.canvas:
Triangle(**args)
points 属性是由三角形的三个顶点的 x 和 y 坐标组成的列表,格式为 (x1, y1, x2, y2, x3, y3)。
Updating a Drawing
需要指出的是,所有图形指令类的列表属性(例如 Triangle.points、Mesh.indices 等)不是 Kivy 属性,而是 Python 属性。因此,修改此列表不会更新绘图。只有当列表对象本身被更改时才会更新绘图,而不会在列表值被修改时更新绘图。
让我们通过将点 (300,300) 更改为 (400,300) 来更改上述矩形的顶点。我们在上述布局中添加一个按钮,并通过 update 方法将其绑定。
Example
以下是完整代码——
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.widget import Widget
from kivy.uix.boxlayout import BoxLayout
from kivy.graphics import *
from kivy.properties import ObjectProperty
from kivy.core.window import Window
Window.size = (720, 400)
class mytriangleapp(App):
triangle = ObjectProperty(None)
title = "Drawing app"
def updating(self, *args):
self.triangle.points[3] = 400
self.triangle.points = self.triangle.points
def build(self):
box = BoxLayout(orientation='vertical')
self.w = Widget()
with self.w.canvas:
Color(1, 1, 1, 1)
self.triangle = Triangle(points=[100, 100, 300, 300, 500, 100])
self.b1 = Button(
text='update', on_press=self.updating,
size_hint=(None, .1)
)
box.add_widget(self.w)
box.add_widget(self.b1)
return box
mytriangleapp().run()