四、编程向导(4.8图形)
admin
2023-07-30 20:45:14
0

编程向导:4.8图形

一、画布介绍

部件绘画的表现使用画布来完成。你可以将它看作一个无限制的画板,或者一个绘画指令的集合。
在你的画布中,你可以应用的指令有很多,但是最主要的两个是:

  • 上下文指令(context instructions)
  • 顶点指令(vertex instructions)

上下文指令不画任何东西,但是它们改变顶点指令的结果。

画布包含指令的两种子集合:canvas.before, canvas.after。这些指令在canvas前或后执行。这些指令直到用户访问时才创建。

为了添加一个画布指令到部件,你需要使用画布上下文:

class MyWidget(Widget):
    def __init__(self, **kwargs):
        super(MyWidget, self).__init__(**kwargs)
        with self.canvas:
            #为主画布添加你的指令

        with self.canvas.before:
            #渲染前执行

        with self.canvas.after:
            #渲染后执行

二、上下文指令

上下文指令操纵Opengl上下文。你可以旋转、转换、拉伸你的画布。你也可以附着一个材质或改变绘画的颜色。这是最常用的,但是其它也是很有用的,比如:

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

三、绘画指令

绘画指令简单的包括画一条直线或一个多边形,复杂的包括贝塞尔曲线:

with self.canvas:
    #画一条直线,使用默认的颜色
    Line(points=(x1, y1, x2, y2, x3, y3))

    #画一个半透明的红色的正方形
    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):
        self.canvas.clear()

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

注意更新的指令被认为是最佳实践,因为它需要更少的开销和避免创建新的指令。

下节预告:编程向导4.9Kv语言

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...