Quick search

Graphics (翻訳済み)

Introduction to Canvas (Canvas入門)

Widget をグラフィカルに表現するには、Canvas (キャンバス) を使用します。Canvas は無限の描画板であり、かつ描画のための Instruction (インストラクション) の集まりとみなすことができます。Canvas に適用、もしくは追加できる Instruction にはいろいろなものがありますが、主に次の2種類に分けられます。

Context instruction は何も描くことはありませんが、Vertex instruction の表示結果 (書式など) を変更します。

Canvas は2種類の Instruction グループを含むことができます。それは:mod:canvas.before <kivy.graphics.Canvas.before> と: mod:canvas.after <kivy.graphics.Canvas.after> です。これらのグループは、それぞれ:mod:~kivy.graphics.canvas の前と後で実行されます。これにより、canvas.before は canvas の下側に、canvas.after は canvas の上側に現れるように見えます。ユーザがアクセスするまで、これらのグループを作ることはできません。

Widget に instruction を追加するには、次のように 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

Context instructions (コンテキスト・インストラクション)

Context instruction は openGL コンテキストを操作します。Canvas を回転したり、別の形に変形したり、スケーリングすることができます。さらにテクスチャを追加したり、描画色を変更することもできます。描画色の変更は最もよく使われるものですが、その他の Context instruction も本当に役立つものです。

with self.canvas.before:
    Color(1, 0, .4, mode='rgb')

Drawing instructions (ドローイング・インストラクション)

描画のための Instruction は、直線や多角形などのとてもシンプルなものから、メッシュやベジエ曲線といったより複雑なものまで、多岐に渡ります。

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)

Manipulating instructions (マニピュレーティング・インストラクション)

そのうち、Canvas に追加した Instruction を更新したり、あるいは削除したりしたくなるでしょう。これはその内容によりますが、様々な方法で実現することができます。

Instruction への参照をキープし、その参照を使って更新することができます:

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 をクリーンし、Instruction を新規に作ることもできます:

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)

実際には、最初の例のように Instruction を更新するのが最良の方法と考えられます。なぜならオーバーヘッドがより少なく、新しい Instruction をわざわざ作ることをしないからです。