图形。

画布(Canvas)简介

Widget 的图形表示通过 canvas 渲染,你可以将其视为一块无限的画板,或是一组绘图指令。你可以向 canvas 应用(添加)许多指令,但主要有两种变体:

上下文指令本身不绘制任何内容,但它们会改变顶点指令的结果。

画布可以包含两个指令子集,分别是 canvas.beforecanvas.after 指令组。这些组中的指令将分别在 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

上下文指令

上下文指令用于操作OpenGL上下文。您可以旋转、平移和缩放画布。您还可以附加纹理或更改绘图颜色。这是最常用的指令,但其他指令也非常有用::

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

绘制说明

绘制指令的范围从非常简单的操作,如绘制线条或多边形,到更复杂的操作,如网格或贝塞尔曲线:

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)

操作指令

有时您需要更新或移除已添加到画布上的指令。根据您的需求,可以通过多种方式实现这一点:

您可以保留对您的指令的引用,并对其进行更新:

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, *args):
        self.canvas.clear()

        with self.canvas:
            self.rect = Rectangle(pos=self.pos, size=self.size)

请注意,更新指令被视为最佳实践,因为它涉及的开销更少,并避免创建新的指令。