編程向?qū)В?.8圖形
一雁乡、畫布介紹
部件繪畫的表現(xiàn)使用畫布來完成第喳。你可以將它看作一個無限制的畫板,或者一個繪畫指令的集合蔗怠。
在你的畫布中墩弯,你可以應(yīng)用的指令有很多,但是最主要的兩個是:
- 上下文指令(context instructions)
- 頂點指令(vertex instructions)
上下文指令不畫任何東西寞射,但是它們改變頂點指令的結(jié)果渔工。
畫布包含指令的兩種子集合:canvas.before, canvas.after。這些指令在canvas前或后執(zhí)行桥温。這些指令直到用戶訪問時才創(chuàng)建引矩。
為了添加一個畫布指令到部件,你需要使用畫布上下文:
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)換掏觉、拉伸你的畫布区端。你也可以附著一個材質(zhì)或改變繪畫的顏色。這是最常用的澳腹,但是其它也是很有用的织盼,比如:
with self.canvas.before:
Color(1, 0, .4, mode='rgb')
三杨何、繪畫指令
繪畫指令簡單的包括畫一條直線或一個多邊形,復(fù)雜的包括貝塞爾曲線:
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)
四危虱、配置指令
有時,你想更新或移除你的指令唐全,根據(jù)你的需要可以使用不同的方式:
你可以保持一個你的指令的引用并更新它們:
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)
注意更新的指令被認為是最佳實踐,因為它需要更少的開銷和避免創(chuàng)建新的指令埃跷。