画布

Canvas 是用于 Widget 绘制的根对象。有关 Canvas 使用的更多信息,请参阅类文档。

class kivy.graphics.instructions.Callback(callback=None, **kwargs)

基类:Instruction

回调(Callback)是一种指令,在执行绘图操作时会被调用。向画布(canvas)添加指令时,你可以这样做:

with self.canvas:
    Color(1, 1, 1)
    Rectangle(pos=self.pos, size=self.size)
    Callback(self.my_callback)

回调函数的定义必须为:

def my_callback(self, instr):
    print('I have been called!')

警告

请注意,如果您频繁或高成本地调用回调函数,可能会显著降低渲染性能。

画布的更新不会在发生新事件之前自动进行。在你的回调函数中,你可以请求更新:

with self.canvas:
    self.cb = Callback(self.my_callback)
# then later in the code
self.cb.ask_update()

如果你使用Callback类调用其他工具包的渲染方法,将会遇到OpenGL上下文的问题。其他工具包可能已经修改了OpenGL状态,一旦程序流程返回到Kivy,它就会崩溃。可能会出现故障、崩溃、黑洞等问题。为避免这种情况,你可以激活:attr:`reset_context`选项。它会在调用你的回调后重置OpenGL上下文状态,以确保Kivy的渲染正确。

警告

reset_context 并非完整的 OpenGL 重置。如果您遇到相关问题,请联系我们。

ask_update(self)

通知父画布,我们希望在下一帧更新它。当您因某些值发生变化而需要触发重绘时,这非常有用。

在 1.0.4 版本加入.

callback

用于获取/设置函数的属性。

reset_context

如果你希望在回调执行后重置Kivy的OpenGL上下文,请将此设置为True。

class kivy.graphics.instructions.Canvas(**kwargs)

基类:CanvasBase

您希望用于绘制的指令。

备注

Canvas 支持 Python 的 with 语句及其进入与退出语义。

不使用``with``语句使用画布的示例:

self.canvas.add(Color(1., 1., 0))
self.canvas.add(Rectangle(size=(50, 50)))

使用Python的``with``语句来操作画布(canvas)的用法如下:

with self.canvas:
    Color(1., 1., 0)
    Rectangle(size=(50, 50))
add(self, Instruction c)

Instruction 追加到我们的列表中。如果画布包含 after 组,则该指令会插入到 after 组之前,而 after 组仍保持在最后。这与 insert() 的工作方式不同,后者可以在任意位置插入。

after

用于获取“after”组的属性。

ask_update(self)

通知画布,我们希望它在下一帧进行更新。当您因某些值发生变化而需要触发重绘时,这非常有用。

before

用于获取“before”组的属性。

clear(self)

清除画布中的所有 Instruction,使其保持干净。

draw(self)

将指令应用于我们的窗口。

has_after

用于查看 after 组是否已创建的属性。

在 1.7.0 版本加入.

has_before

用于查看 before 组是否已创建的属性。

在 1.7.0 版本加入.

opacity

用于获取/设置画布不透明度的属性。

在 1.4.1 版本加入.

opacity 属性控制画布及其子元素的透明度。请注意,这是一个累积属性:该值会与当前全局透明度相乘,并将结果应用于当前上下文颜色。

例如:如果父级的不透明度为0.5,而子级的不透明度为0.2,那么子级的实际不透明度将是0.5 * 0.2 = 0.1。

然后,不透明度在着色器中应用如下:

frag_color = color * vec4(1.0, 1.0, 1.0, opacity);
remove(self, Instruction c)
class kivy.graphics.instructions.CanvasBase

基类:InstructionGroup

CanvasBase 为 Canvas 提供了上下文管理器方法。

class kivy.graphics.instructions.ContextInstruction(**kwargs)

基类:Instruction

这些指令没有直接的视觉表现,而是修改当前画布的状态,例如纹理绑定、设置颜色参数、矩阵操作等。

class kivy.graphics.instructions.Instruction(**kwargs)

基类:ObjectWithUid

仅供使用,请勿直接使用。

flag_data_update(self)
flag_update(self, int do_parent=1)
group

group: unicode

proxy_ref

返回对指令的代理引用,即不创建该控件的引用。更多信息请参阅 weakref.proxy

在 1.7.2 版本加入.

class kivy.graphics.instructions.InstructionGroup(**kwargs)

基类:Instruction

图形指令。可直接按如下方式使用:

blue = InstructionGroup() blue.add(Color(0, 0, 1, 0.2)) blue.add(Rectangle(pos=self.pos, size=(100, 100)))

green = InstructionGroup() green.add(Color(0, 1, 0, 0.4)) green.add(Rectangle(pos=(100, 100), size=(100, 100)))

# 此处,self 应为 Widget 或其子类 [self.canvas.add(group) for group in [blue, green]]

add(self, Instruction c)

在我们的列表中添加一个新的 Instruction

children

children: list

clear(self)

移除所有 Instructions

get_group(self, unicode groupname)

返回一个可迭代对象,用于获取所有具有特定组名的 Instructions

indexof(self, Instruction c)
insert(self, int index, Instruction c)

在索引位置向我们的列表插入一个新的 Instruction

length(self)
remove(self, Instruction c)

从我们的列表中移除一个现有的 Instruction

remove_group(self, unicode groupname)

移除所有具有特定组名的 Instructions

class kivy.graphics.instructions.RenderContext(*args, **kwargs)

基类:Canvas

  • 顶点着色器

  • 片段着色器

  • 默认纹理

  • 状态栈(颜色、纹理、矩阵...)

shader

返回与渲染上下文关联的着色器。

use_parent_frag_modelview

如果为 True,将使用父片段模型视图矩阵。

在 1.10.1 版本加入: rc = RenderContext(use_parent_frag_modelview=True)

use_parent_modelview

如果为 True,将使用父级模型视图矩阵。

在 1.7.0 版本加入.

Before:

rc['modelview_mat'] = Window.render_context['modelview_mat']

现在:

rc = RenderContext(use_parent_modelview=True)
use_parent_projection

如果为 True,则将使用父级投影矩阵。

在 1.7.0 版本加入.

Before:

rc['projection_mat'] = Window.render_context['projection_mat']

现在:

rc = RenderContext(use_parent_projection=True)
class kivy.graphics.instructions.VertexInstruction(**kwargs)

基类:Instruction

在画布上具有直接视觉表示的图形,如矩形、三角形、线条、椭圆等。

source

此属性表示要加载纹理的文件名。如果你想使用图像作为源,可以这样做::

with self.canvas:
    Rectangle(source='mylogo.png', pos=self.pos, size=self.size)

以下是Kivy语言中的等效写法:

<MyWidget>:
    canvas:
        Rectangle:
            source: 'mylogo.png'
            pos: self.pos
            size: self.size

备注

将使用 kivy.resources.resource_find() 函数来搜索该文件名。

tex_coords

该属性表示用于绘制顶点指令的纹理坐标。该值必须是一个包含8个值的列表。

纹理坐标包含位置 (u, v) 和大小 (w, h)。大小可以为负值,表示“翻转”的纹理。默认情况下,tex_coords 为:

[u, v, u + w, v, u + w, v + h, u, v + h]

如果你想实现炫酷的效果,可以传入自定义的纹理坐标。

警告

刚才提到的默认值可以是负数。根据图像和标签提供者的不同,由于图像内部存储的顺序,坐标会在垂直方向上翻转。为了更快,我们不是翻转图像数据,而是直接翻转纹理坐标。

texture

表示用于绘制此指令的纹理的属性。您可以像这样设置新纹理::

from kivy.core.image import Image

texture = Image('logo.png').texture
with self.canvas:
    Rectangle(texture=texture, pos=self.pos, size=self.size)

通常,你会使用 source 属性而不是纹理。