編程向?qū)В?.8圖形
一、畫布介紹
部件繪畫的表現(xiàn)使用畫布來完成。你可以將它看作一個(gè)無限制的畫板,或者一個(gè)繪畫指令的集合。
在你的畫布中,你可以應(yīng)用的指令有很多,但是最主要的兩個(gè)是:
- 上下文指令(context instructions)
- 頂點(diǎn)指令(vertex instructions)
上下文指令不畫任何東西,但是它們改變頂點(diǎn)指令的結(jié)果。
畫布包含指令的兩種子集合:canvas.before, canvas.after。這些指令在canvas前或后執(zhí)行。這些指令直到用戶訪問時(shí)才創(chuàng)建。
為了添加一個(gè)畫布指令到部件,你需要使用畫布上下文:
class MyWidget(Widget):
def __init__(self, **kwargs):
super(MyWidget, self).__init__(**kwargs)
with self.canvas:
#為主畫布添加你的指令
with self.canvas.before:
#渲染前執(zhí)行
with self.canvas.after:
#渲染后執(zhí)行
二、上下文指令
上下文指令操縱Opengl上下文。你可以旋轉(zhuǎn)、轉(zhuǎn)換、拉伸你的畫布。你也可以附著一個(gè)材質(zhì)或改變繪畫的顏色。這是最常用的,但是其它也是很有用的,比如:
with self.canvas.before:
Color(1, 0, .4, mode='rgb')
三、繪畫指令
繪畫指令簡(jiǎn)單的包括畫一條直線或一個(gè)多邊形,復(fù)雜的包括貝塞爾曲線:
with self.canvas:
#畫一條直線,使用默認(rèn)的顏色
Line(points=(x1, y1, x2, y2, x3, y3))
#畫一個(gè)半透明的紅色的正方形
Color(1, 0, 0, .5, mode='rgba')
Rectangle(pos=self.pos, size=self.size)
四、配置指令
有時(shí),你想更新或移除你的指令,根據(jù)你的需要可以使用不同的方式:
你可以保持一個(gè)你的指令的引用并更新它們:
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
或者你可以清理你的畫布并啟動(dòng)刷新:
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)
注意更新的指令被認(rèn)為是最佳實(shí)踐,因?yàn)樗枰俚拈_銷和避免創(chuàng)建新的指令。