9. 图形
优质
小牛编辑
141浏览
2023-12-01
译者前言
这一章节比前两章节简单很多,翻译的也比较顺了。
简介Canvas
Kivy中控件图形呈现是使用Canvas完成的,可以将其看作一个无限的绘图板,也是一组绘图指令。有很多种绘图指令都可以应用或者添加到你的Canvas伤,不过总体上分为两类:
context instructions
环境指令不绘制任何图形,但会改变vertex instructions
顶点指令的绘制结果。
Canvas都包含两个指令分支。分别是canvas.before
和canvas.after
这两种指令群。这两组指令分别在Canvas
图形绘制前后执行。
绘制前的会被绘制的图形覆盖掉,绘制后的会覆盖在图形上层。这些指令都在用户对它们读取之后才会被创建。
要对一个控件添加Canvas绘图指令,需要使用Canvas环境指令:
class MyWidget(Widget):
def __init__(self, **kwargs):
super(MyWidget, self).__init__(**kwargs)
with self.canvas:
# add your instruction for main canvas here
# 这里是增加一个座位主绘图的指令
with self.canvas.before:
# you can use this to add instructions rendered before
# 这里可以在绘图之前添加指令
with self.canvas.after:
# you can use this to add instructions rendered after
# 这里可以在绘图之后添加指令
环境指令
环境指令是用于操作opengl环境。 可以旋转,翻译和缩放画布。还可以附加纹理或更改绘图颜色。下面这段代码里面的是最常用到的更改颜色的指令,其他的环境指令也都很有用处:
with self.canvas.before:
Color(1, 0, .4, mode='rgb')
绘图指令
绘图指令可简可繁,最简单的比如画一个多边形,更复杂的比如绘制网格或者贝塞尔曲线都可以:
with self.canvas:
# draw a line using the default color
# 用默认颜色画一条线
Line(points=(x1, y1, x2, y2, x3, y3))
# lets draw a semi-transparent red square
# 接下来画一个半透明的红方块
Color(1, 0, 0, .5, mode='rgba')
Rectangle(pos=self.pos, size=self.size)
操作指令
有时候可能需要把之前添加到Canvas绘图上的指令进行更改或者删除,这可以有很多种办法,要根据具体需求来选择:
可以给指令创建一个引用然后对其进行更新:
class MyWidget(Widget):
def __init__(self, **kwargs):
super(MyWidget, self).__init__(**kwargs)
with self.canvas:
self.rect = Rectangle(pos=self.pos, size=self.size)
self.bind(pos=self.update_rect)
self.bind(size=self.update_rect)
def update_rect(self, *args):
self.rect.pos = self.pos
self.rect.size = self.size
或者也可以清空Canvas画布然后重新画:
class MyWidget(Widget):
def __init__(self, **kwargs):
super(MyWidget, self).__init__(**kwargs)
self.draw_my_stuff()
self.bind(pos=self.draw_my_stuff)
self.bind(size=self.draw_my_stuff)
def draw_my_stuff(self):
self.canvas.clear()
with self.canvas:
self.rect = Rectangle(pos=self.pos, size=self.size)
要注意更新指令的方法是更好的选择,因为这样减少了开销,并且避免了创建新指令。