图形

画布简介

Widgets 图形表示是使用画布呈现的,您可以将其视为无限的绘图板或一组绘图指令。您可以将许多说明应用(添加)到您的画布上,但主要有两个变体:

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

画布可以包含两个指令子集。他们是 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)

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

Last updated