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