四、編程向?qū)?4.8圖形)

編程向?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)建新的指令。

下節(jié)預(yù)告:編程向?qū)?.9Kv語(yǔ)言

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容