Table Of Contents
Graphics (翻訳済み)¶
Introduction to Canvas (Canvas入門)¶
Widget をグラフィカルに表現するには、Canvas (キャンバス) を使用します。Canvas は無限の描画板であり、かつ描画のための Instruction (インストラクション) の集まりとみなすことができます。Canvas に適用、もしくは追加できる Instruction にはいろいろなものがありますが、主に次の2種類に分けられます。
context instructions
(コンテキスト・インストラクション)vertex instructions
(ヴァーテックス・インストラクション)
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 をわざわざ作ることをしないからです。