目录

图形。

该包汇集了许多用于绘制的底层函数。整个图形包兼容OpenGL ES 2.0,并包含多种渲染优化。

基础要点

要在屏幕上进行绘制,你需要:

  1. 一个 Canvas 对象。

  2. Instruction 对象。

Kivy 中的每个 Widget 默认已经拥有一个 Canvas。当你创建一个控件时,你可以创建所有绘制所需的指令。如果 self 是当前控件,你可以这样做:

from kivy.graphics import *
with self.canvas:
    # Add a red color
    Color(1., 0, 0)

    # Add a rectangle
    Rectangle(pos=(10, 10), size=(500, 500))

指令 ColorRectangle 会自动添加到画布对象中,并在窗口绘制时被使用。

备注

Kivy 绘图指令不会自动相对于部件的位置或大小。因此,在绘图时需要考虑这些因素。为了使绘图指令相对于部件,指令需要在 KvLang 中声明,或者绑定到位置和大小变化上。更多详情请参阅 为布局添加背景

GL 重载机制

在 1.2.0 版本加入.

在应用程序的生命周期内,OpenGL上下文可能会丢失。这种情况发生在:

  • 当在OS X或Windows平台上调整窗口大小,并且使用pygame作为窗口提供程序时,会出现此问题。这是因为SDL 1.2的设计所致。在SDL 1.2中,每次调整窗口大小时都需要重新创建GL上下文。这个问题在SDL 1.3中已得到修复,但pygame默认尚未支持该版本。

  • 当Android释放应用资源时:当您的应用进入后台,Android可能会回收您的OpenGL上下文,以便将资源分配给其他应用。当用户切换回您的应用时,系统会为您的应用提供一个新创建的GL上下文。

从1.2.0版本开始,我们引入了一种机制,用于重新加载所有使用GPU的图形资源:Canvas、FBO、Shader、Texture、VBO和VertexBatch。

  • VBO和VertexBatch由我们的图形指令构建。在重新加载时,我们拥有重建所需的所有数据。

  • Shader:与VBO相同,我们存储着色器中使用的源代码和值,以便能够重新创建顶点/片段/程序。

  • 纹理:如果纹理有来源(图像文件或图集),则从来源重新加载图像并重新上传至GPU。

您应自行处理这些情况:

  • 无源纹理:如果您手动创建了纹理并手动将数据/缓冲区写入其中,则必须自行处理重新加载。请参阅 纹理 了解如何管理这种情况。(文本渲染已生成纹理并处理重新加载,您无需自行重新加载文本。)

  • FBO:如果你在FBO上多次添加/移除/绘制内容,我们无法重新加载它。我们不会保留放置在其上的指令历史。至于没有来源的纹理,请查阅:doc:`api-kivy.graphics.fbo`了解如何处理该情况。

class kivy.graphics.ApplyContextMatrix(**kwargs)

基类:ContextInstruction

target_stack 由位于 source_stack 顶部的矩阵组成。

在 1.6.0 版本加入.

source_stack

用作来源的矩阵栈名称。可以是'modelview_mat'、'projection_mat'或'frag_modelview_mat'。

在 1.6.0 版本加入.

target_stack

用作目标的矩阵栈名称。可以是'modelview_mat'、'projection_mat'或'frag_modelview_mat'。

在 1.6.0 版本加入.

class kivy.graphics.Bezier(**kwargs)

基类:VertexInstruction

在 1.0.8 版本加入.

参数:
points:列表

格式为(x1, y1, x2, y2...)的点列表。

segments:整数,默认值为180

定义绘制曲线所需的线段数量。线段越多,绘制出的曲线就越平滑。

loop:布尔值,默认为 False

将贝塞尔曲线设置为连接最后一个点与第一个点。

dash_length:整数

线段长度(若为虚线),默认为1。

dash_offset:整数

段与段之间的间距,默认为0。调整此值可实现虚线效果。

dash_length

用于获取/设置曲线中虚线长度的属性。

dash_offset

用于获取/设置曲线中虚线之间偏移量的属性。

points

用于获取/设置三角形点的属性。

警告

这将始终根据新的点列表重建整个图形,可能会非常消耗CPU资源。

segments

用于获取/设置曲线段数的属性。

class kivy.graphics.BindTexture(**kwargs)

基类:ContextInstruction

BindTexture 指令将绑定一个纹理,并为后续绘制启用 GL_TEXTURE_2D。

参数:
texture:纹理

指定要绑定到给定索引的纹理。

source

设置/获取用于加载纹理的源(文件名)。

class kivy.graphics.BorderImage(**kwargs)

基类:Rectangle

CSS3边框图像的概念。

参数:
border:列表

边框信息格式为(底部,右侧,顶部,左侧)。每个值以像素为单位。

auto_scale:字符串

在 1.9.1 版本加入.

在 1.9.2 版本发生变更: 这原本是一个布尔值,现已改为字符串状态。

可为以下值之一:'off'、'both'、'x_only'、'y_only'、'y_full_x_lower'、'x_full_y_lower'、'both_lower'。

Autoscale 控制 9-slice 的行为。

默认情况下,边框值会被精确保留,这意味着如果对象的总尺寸小于边框值,你将遇到一些“渲染错误”,纹理可能会出现内外颠倒的情况。这也使得无法实现一个比其源纹理尺寸更大的圆角按钮。auto_scale 的各种选项将允许你实现这两种渲染类型的混合效果。

'off':默认值,行为与之前 auto_scale 为 False 时的 BorderImage 相同。

'both':根据BorderImage的尺寸同时缩放x和y维度的边框,这会禁用BorderImage,使其渲染效果与普通Image相同。

'x_only':Y 维度保持默认行为,而 X 维度则根据 BorderImage 的宽度进行缩放。

'y_only':X 维度作为默认值,Y 则根据 BorderImage 的高度进行缩放。

'y_full_x_lower':Y 的缩放方式与 'y_only' 相同,仅当缩放后的尺寸小于提供的边框时,Y 才进行缩放。

'x_full_y_lower':X 的缩放方式与 'x_only' 相同,Y 仅在缩放后的大小小于提供的边框时才进行缩放。

'both_lower':这是1.9.1版本中auto_scale为True时的行为。如果BorderImage小于源图像,则X和Y两个维度都将被缩放。

如果BorderImage的尺寸(水平或垂直方向)小于其边框之和,且此属性设置为True,则边框将被重新缩放以适应较小的尺寸。

auto_scale

用于设置当BorderImage过小时是否自动缩放边角的属性。

border

用于获取/设置类边框的属性。

display_border

用于获取/设置边框显示尺寸的属性。

class kivy.graphics.BoxShadow(*args, **kwargs)

基类:InstructionGroup

在 2.2.0 版本加入.

在 2.3.0 版本发生变更: 修复了使用 add()insert()remove() 管理 Canvas 的问题。此前,使用这些方法管理 Canvas 没有任何效果。

基类也从 Fbo 更改为 InstructionGroup

参数:
inset:布尔值,默认为 False

定义阴影是从内向外绘制,还是从轮廓向``BoxShadow``指令内部绘制。

size:列表 | 元组,默认为 (100.0, 100.0)

定义阴影的原始尺寸,即设置此参数时,不应考虑 blur_radiusspread_radius 属性值的变化。

pos:列表或元组,默认为 (0.0, 0.0)

定义阴影的原始位置,即设置此参数时,不应考虑 offset 属性值的变化。

offset:列表或元组,默认为 (0.0, 0.0)

(水平, 垂直) 格式指定阴影偏移量。偏移量的正值表示阴影应向右和/或向上移动。负值表示阴影应向左和/或向下移动。

blur_radius:浮点数,默认值为 15.0

定义阴影模糊半径。控制阴影的扩展范围和柔和度。

spread_radius:列表或元组,默认值为 (0.0, 0.0)

定义阴影的收缩/扩展。

border_radius:列表或元组,默认为 (0.0, 0.0, 0.0, 0.0)

指定用于圆角的半径,按顺时针方向依次为:左上、右上、右下、左下。

blur_radius

定义阴影模糊半径。控制阴影的扩展范围和柔和度。

默认为 15.0

在下图中,阴影模糊效果长度的起始和结束位置已标明。颜色与透明度之间的过渡无缝衔接,尽管阴影看似在虚线矩形之前结束,但其末端被设计得尽可能平滑。



备注

在某些情况下(如果这不是你的本意),将元素放置在阴影之上(在模糊半径结束之前)会导致不必要的裁剪/覆盖行为,而非连续性,从而破坏阴影的柔和收尾,如下图所示。


_images/boxshadow_common_mistake_1.svg
border_radius

指定用于圆角的半径,按顺时针方向依次为:左上、右上、右下、左下。

默认为 (0.0, 0.0, 0.0, 0.0)


inset

定义阴影是从内向外绘制,还是从轮廓向``BoxShadow``指令内部绘制。

默认为 False

备注


尽管内嵌模式决定了阴影的绘制行为,但``BoxShadow``指令在``canvas``层级中的位置取决于:class:`~kivy.graphics.instructions.Canvas`指令树中存在的其他图形指令。


换句话说,如果**目标**位于``canvas``层,并且你想使用默认的``inset = False``模式来创建凸起效果,则必须在``canvas.before``层中声明``BoxShadow``指令。


_images/boxshadow_example_1.png
<MyWidget@Widget>:
    size_hint: None, None
    size: 100, 100
    pos: 100, 100

    canvas.before:
        # BoxShadow statements
        Color:
            rgba: 0, 0, 0, 0.65
        BoxShadow:
            pos: self.pos
            size: self.size
            offset: 0, -10
            blur_radius: 25
            spread_radius: -10, -10
            border_radius: 10, 10, 10, 10

    canvas:
        # target element statements
        Color:
            rgba: 1, 1, 1, 1
        Rectangle:
            pos: self.pos
            size: self.size

或者,如果目标位于``canvas``图层中,并且您希望使用``inset = True``模式来创建插入效果,则必须在``canvas``图层中,紧跟在**目标**``canvas``声明之后声明``BoxShadow``指令,或者在``canvas.after``中声明它。


_images/boxshadow_example_2.png
<MyWidget@Widget>:
    size_hint: None, None
    size: 100, 100
    pos: 100, 100

    canvas:
        # target element statements
        Color:
            rgba: 1, 1, 1, 1
        Rectangle:
            pos: self.pos
            size: self.size

        # BoxShadow statements
        Color:
            rgba: 0, 0, 0, 0.65
        BoxShadow:
            inset: True
            pos: self.pos
            size: self.size
            offset: 0, -10
            blur_radius: 25
            spread_radius: -10, -10
            border_radius: 10, 10, 10, 10

总结:

  • 高度效果 - inset = FalseBoxShadow 指令需要在目标元素**之前**绘制。

  • 插入效果 - inset = TrueBoxShadow 指令需要在目标元素**之后**绘制。


一般来说,BoxShadow 比 CSS 的 box-shadow 更为灵活,因为 inset = Falseinset = True 模式分别不会限制阴影在目标元素下方和上方的绘制。实际上,您可以在 Canvas 声明树中定义任何您想要的层级结构,以创建超越常见阴影效果的更复杂效果。

模式:

  • ``False``(默认值)- 阴影在``BoxShadow``指令内部向外绘制,产生凸起效果。

  • True - 阴影从轮廓向内绘制到 BoxShadow 指令内部,产生内嵌效果。

_images/boxshadow_inset.svg
offset

[水平, 垂直] 格式指定阴影偏移量。偏移量为正值表示阴影应向右和/或向上移动。负值表示阴影应向左和/或向下移动。

默认为 (0.0, 0.0)

为使该属性按预期工作,建议 pos 的值与阴影目标元素的位置一致,如下例所示:


pos

定义阴影的原始位置,即设置此属性时,不应考虑 offset 属性值的变化。

  • inset 关闭

    根据调整后的阴影 sizeoffset 属性,返回阴影的调整后位置。

  • inset 开启

    返回原始位置(与指定位置相同)。

默认为 (0.0, 0.0)

备注

建议该属性与阴影目标元素的原始位置保持一致。如需调整水平和垂直偏移,请改用 offset 属性。

size

定义阴影的原始尺寸,即不应考虑 blur_radiusspread_radius 属性值的变化。

默认为 (100.0, 100.0)

备注

建议将该属性与阴影目标元素的原始尺寸保持一致。如需控制阴影原始 size 的收缩/扩展,请改用 spread_radius

spread_radius

定义阴影在 [水平, 垂直] 格式下的收缩/扩展。

默认为 (0.0, 0.0)

该属性在以下场景中尤为有用:当您希望通过为 spread_radius 设置负值,并为 blur_radius 设置较大值,以实现元素周围更柔和的阴影效果时,可参考 示例 中的做法。

  • inset 关闭

    在下图中,目标元素的原始尺寸为 200 x 150px。对 spread_radius 值的正向调整会导致阴影的原始 size 增大,而负向值则会使阴影缩小。

    _images/boxshadow_spread_radius.svg

  • inset 开启

    正值会使阴影向边界框内扩展,而负值则会使阴影收缩。

    _images/boxshadow_spread_radius_inset.svg
class kivy.graphics.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.Canvas(**kwargs)

基类:CanvasBase

用于绘制的指令。

备注

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

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

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

使用Python的``with``语句来操作画布:

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.CanvasBase

基类:InstructionGroup

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

class kivy.graphics.ChangeState(**kwargs)

基类:ContextInstruction

当前渲染上下文。

在 1.6.0 版本加入.

class kivy.graphics.ClearBuffers(*args, **kwargs)

基类:Instruction

在 1.3.0 版本加入.

根据指令的缓冲区掩码属性清除指定的缓冲区。默认情况下,仅清除颜色缓冲区。

clear_color

如果为 True,颜色缓冲区将被清除。

clear_depth

如果为 True,深度缓冲区将被清除。

clear_stencil

如果为 True,则模板缓冲区将被清除。

class kivy.graphics.ClearColor(r, g, b, a, **kwargs)

基类:Instruction

在 1.3.0 版本加入.

设置用于通过glClear函数或:class:`ClearBuffers`图形指令清除缓冲区时所使用的清除颜色。

a

Alpha 分量,取值范围在 0 到 1 之间。

b

蓝色分量,取值范围在0到1之间。

g

绿色分量,取值范围在0到1之间。

r

红色分量,取值范围在0到1之间。

rgb

RGB 颜色,一个包含 3 个值的列表,取值范围为 0-1,其中 alpha 将为 1。

rgba

用于清除颜色的RGBA颜色,一个包含4个0-1范围内值的列表。

class kivy.graphics.Color(*args, **kwargs)

基类:ContextInstruction

在其之后绘制。

这表示一个介于0和1之间的颜色,但在画布中作为*乘数*应用于其后任何顶点指令的纹理。如果未设置纹理,则顶点指令将采用Color指令的精确颜色。

例如,如果一个 Rectangle 的纹理具有均匀颜色 (0.5, 0.5, 0.5, 1.0),且前面的 Color 指令设置了 rgba=(1, 0.5, 2, 1),那么实际可见的颜色将是 (0.5, 0.25, 1.0, 1.0),因为 Color 指令作为乘数应用于每个 rgba 分量。在这种情况下,超出 0-1 范围的 Color 分量会产生可见效果,因为蓝色分量的强度被加倍了。

在Python中声明一个Color,你可以这样做::

from kivy.graphics import Color

# create red v
c = Color(1, 0, 0)
# create blue color
c = Color(0, 1, 0)
# create blue color with 50% alpha
c = Color(0, 1, 0, .5)

# using hsv mode
c = Color(0, 1, 1, mode='hsv')
# using hsv mode + alpha
c = Color(0, 1, 1, .2, mode='hsv')

你也可以通过关键字参数来设置颜色组件,这些组件作为属性可用,例如::

c = Color(b=0.5)  # sets the blue component only

在kv语言中,你可以直接设置颜色属性:

<Rule>:
    canvas:
        # red color
        Color:
            rgb: 1, 0, 0
        # blue color
        Color:
            rgb: 0, 1, 0
        # blue color with 50% alpha
        Color:
            rgba: 0, 1, 0, .5

        # using hsv mode
        Color:
            hsv: 0, 1, 1
        # using hsv mode + alpha
        Color:
            hsv: 0, 1, 1
            a: .5
a

Alpha 分量,取值范围在 0 到 1 之间。

b

蓝色分量,取值范围在0到1之间。

g

绿色分量,取值范围在0到1之间。

h

色调分量,取值范围在0到1之间。

hsv

HSV 颜色,包含 3 个 0-1 范围内的值,alpha 将为 1。

r

红色分量,取值范围在0到1之间。

rgb

RGB 颜色,由 0-1 范围内的 3 个值组成的列表。alpha 值将为 1。

rgba

RGBA颜色,由0-1范围内的4个值组成的列表。

s

饱和度分量,取值范围在0到1之间。

v

值组件,范围在0到1之间。

class kivy.graphics.ContextInstruction(**kwargs)

基类:Instruction

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

class kivy.graphics.Ellipse(*args, **kwargs)

基类:Rectangle

参数:
segments:整数,默认值根据角度之间的范围计算得出。

定义绘制椭圆所需的线段数量。线段越多,椭圆绘制得越平滑,但您也可以利用此属性创建具有3条或更多边的多边形。

angle_start:浮点数,默认值为 0.0

指定圆盘部分的起始角度,单位为度。

angle_end:浮点数,默认值为360.0

指定圆盘部分的结束角度,单位为度。

在 1.0.7 版本发生变更: 添加了angle_start和angle_end。

在 2.2.0 版本发生变更: 默认的线段数量不再是180,现在根据角度范围计算,因为这是一种更高效的方法。

angle_end

椭圆结束角度(以度为单位),默认为360。

angle_start

椭圆起始角度,单位为度,默认值为0。

segments

用于获取/设置椭圆段数的属性。如果段数较多,椭圆绘制将更加平滑,但您也可以利用此属性创建具有3条或更多边的多边形。小于3的值将不会被表示,段数将自动计算。

在 2.2.0 版本发生变更: 允许的最小段数为3。小于此值的设置将被忽略,段数将自动计算。

class kivy.graphics.Fbo(*args, **kwargs)

基类:RenderContext

with 语句。

参数:
clear_color:元组,默认值为 (0, 0, 0, 0)

定义用于清除帧缓冲区的默认颜色。

size:元组,默认值为 (1024, 1024)

帧缓冲区的默认大小

push_viewport:布尔值,默认为 True

如果为True,OpenGL视口将被设置为帧缓冲大小,并在帧缓冲释放时自动恢复。

with_depthbuffer:布尔值,默认为False

如果为 True,帧缓冲区将分配一个 Z 缓冲区。

with_stencilbuffer:布尔值,默认为False

在 1.9.0 版本加入.

如果为 True,帧缓冲区将分配一个模板缓冲区。

textureTexture,默认为 None

如果为 None,将创建一个默认纹理。

备注

在kivy 1.9.0中,不支持同时使用``with_stencilbuffer``和``with_depthbuffer``。

add_reload_observer(self, callback)

添加一个回调函数,在整个图形上下文重新加载后调用。这是你可以在GPU中重新上传自定义数据的地方。

在 1.2.0 版本加入.

参数:
callback: func(context) -> 返回 None

第一个参数将是上下文本身。

bind(self)

将FBO绑定到当前的OpenGL上下文中。`Bind`意味着你启用了帧缓冲,所有绘制操作将在帧缓冲内部进行,直到调用:meth:`release`为止。

当您向其中添加图形对象时,绑定/释放操作会自动调用。如果您想自行操作帧缓冲,可以这样使用::

self.fbo = FBO()
self.fbo.bind()
# do any drawing command
self.fbo.release()

# then, your fbo texture is available at
print(self.fbo.texture)
clear_buffer(self)

使用 clear_color 清除帧缓冲。

在调用此方法之前,您需要自行绑定帧缓冲器:

fbo.bind()
fbo.clear_buffer()
fbo.release()
clear_color

以(红、绿、蓝、透明度)格式清除颜色。

get_pixel_color(self, int wx, int wy)

获取指定窗口坐标(wx, wy)处像素的颜色。返回结果为RGBA格式。

在 1.8.0 版本加入.

pixels

获取像素纹理,仅限RGBA格式,无符号字节。图像原点位于左下角。

在 1.7.0 版本加入.

release(self)

释放帧缓冲(解除绑定)。

remove_reload_observer(self, callback)

从观察者列表中移除之前通过 add_reload_observer() 添加的回调。

在 1.2.0 版本加入.

size

帧缓冲区的尺寸,格式为(宽度,高度)。

如果您更改大小,帧缓冲区内容将会丢失。

texture

返回帧缓冲纹理。

exception kivy.graphics.GraphicException

基类:Exception

当图形错误被触发时引发的异常。

class kivy.graphics.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.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.Line(**kwargs)

基类:VertexInstruction

绘制一条线可以轻松完成:

with self.canvas:
    Line(points=[100, 100, 200, 100, 100, 200], width=10)

该线条有3种内部绘制模式,为了获得最佳效果,您应当了解这些模式:

  1. 如果 width 为 1.0 且 force_custom_drawing_method 为 False,则将使用 OpenGL 中的标准 GL_LINE 绘制方式。此时 dash_lengthdash_offsetdashes 属性将生效,而 cap 和 joint 相关的属性在此情况下没有意义。

  2. 如果 width 大于 1.0 或 force_custom_drawing_method 为 True,则将使用基于三角剖分的自定义绘制方法。在此模式下,dash_lengthdash_offsetdashes 不起作用。此外,如果当前颜色的 alpha 值小于 1.0,则会在内部使用模板来绘制线条。

_images/line-instruction.png
参数:
points:列表

格式为(x1, y1, x2, y2...)的点列表。

dash_length:整数

线段长度(若为虚线),默认为1。

dash_offset:整数

段与下一段起点之间的偏移量,默认为0。更改此值可使其呈现虚线效果。

dashes:整数列表

[ON长度,偏移量,ON长度,偏移量,...]的列表。例如,[2,4,1,6,8,2] 会创建一条线,其中第一个破折号长度为2,然后偏移量为4,接着破折号长度为1,再偏移量为6,依此类推。默认为 []。更改此属性会使线条变为虚线,并覆盖 dash_lengthdash_offset

width:浮点数

线条宽度,默认为1.0。

cap:字符串类型,默认值为 'round'

更多信息请参阅 cap

joint:字符串,默认值为 'round'

更多信息请参阅 joint

cap_precision:整数,默认为10

更多信息请参阅 cap_precision

joint_precision:整数,默认值为10

更多信息请参阅 joint_precision,更多信息请参阅 cap_precision

joint_precision:整数,默认值为10

更多信息请参阅 joint_precision

close:布尔值,默认为 False

如果为 True,线条将被闭合。

circle:列表

如果设置了该属性,points 将被设置为构建一个圆形。更多信息请参阅 circle

ellipse:列表

如果设置了该属性,points 将被设置为构建一个椭圆。更多信息请参阅 ellipse

rectangle:列表

如果设置了该属性,points 将被设置为构建一个矩形。更多信息请参阅 rectangle

bezier:列表

如果设置了该属性,points 将被设置为构建贝塞尔曲线。更多信息请参阅 bezier

bezier_precision:整数,默认值为180

贝塞尔曲线绘制的精度。

force_custom_drawing_method:布尔值,默认为False

如果使用自定义绘制方法,则不应再依赖 width 是否等于 1.0。

在 1.0.8 版本发生变更: dash_offsetdash_length 已被添加。

在 1.4.1 版本发生变更: 已添加 widthcapjointcap_precisionjoint_precisioncloseellipserectangle 属性。

在 1.4.1 版本发生变更: bezierbezier_precision 已被添加。

在 1.11.0 版本发生变更: dashes 已被添加。

在 2.3.0 版本发生变更: force_custom_drawing_method 已被添加。

bezier

使用此属性来构建贝塞尔曲线,无需计算 points。您只能设置此属性,不能获取它。

参数必须是一个包含2n个元素的元组,其中n为点的数量。

用法:

Line(bezier=(x1, y1, x2, y2, x3, y3)

在 1.4.2 版本加入.

备注

贝塞尔线的计算在点数较少时开销不大,但复杂度是二次方的,因此包含大量点的线条构建成本可能非常高,请谨慎使用!

bezier_precision

2 个线段之间绘制贝塞尔曲线的迭代次数,默认为 180。bezier_precision 必须至少为 1。

在 1.4.2 版本加入.

cap

确定线条的端点样式,默认为“round”(圆头)。可选值为“none”(无)、“square”(方头)或“round”(圆头)。

在 1.4.1 版本加入.

cap_precision

绘制“圆头”帽的迭代次数,默认为10。cap_precision 必须至少为1。

在 1.4.1 版本加入.

circle

使用此属性来构建圆形,无需计算 points

参数必须是一个元组,格式为 (center_x, center_y, radius, angle_start, angle_end, segments)。

  • center_x 和 center_y 表示圆的中心。

  • radius 表示圆的半径。

  • (可选)angle_start 和 angle_end 以度为单位。默认值为 0 和 360。

  • (可选)segments 是椭圆的精度。默认值根据 angle 的范围计算得出。

请注意,是否要:attr:`close`(闭合)这个圆环完全由您决定。

例如,要构建一个简单的椭圆,在Python中:

# simple circle
Line(circle=(150, 150, 50))

# only from 90 to 180 degrees
Line(circle=(150, 150, 50, 90, 180))

# only from 90 to 180 degrees, with few segments
Line(circle=(150, 150, 50, 90, 180, 20))

在 1.4.1 版本加入.

在 2.2.0 版本发生变更: 现在你可以通过该属性获取生成的圆形。

close

如果为 True,则根据 close_mode 将线条两端连接起来,使其闭合。

在 1.4.1 版本加入.

close_mode

定义线条端点如何连接。默认值为 "straight-line"

备注

不同关闭模式的支持取决于绘制形状的方式。

可用模式:

  • ``"直线"``(所有绘制形状):端点将由一条直线闭合。

  • ``"center-connected"``ellipse 特有):两端将通过一条穿过椭圆中心的线闭合。

在 2.2.0 版本加入.

dash_length

用于获取/设置曲线中虚线长度的属性。

在 1.0.8 版本加入.

dash_offset

用于获取/设置曲线中虚线之间偏移量的属性。

在 1.0.8 版本加入.

dashes

用于获取/设置``dashes``的属性。

[ON长度,偏移量,ON长度,偏移量,...]的列表。例如,[2,4,1,6,8,2] 将创建一条线,其中第一个破折号长度为2,然后偏移量为4,接着破折号长度为1,再偏移量为6,依此类推。

在 1.11.0 版本加入.

ellipse

使用此属性来构建椭圆,无需计算 points

参数必须是一个包含 (x, y, width, height, angle_start, angle_end, segments) 的元组。

  • x 和 y 表示椭圆的左下角。

  • width 和 height 表示椭圆的大小。

  • (可选)angle_start 和 angle_end 以度为单位。默认值为 0 和 360。

  • (可选)segments 是椭圆的精度。默认值根据 angle 的范围计算得出。您可以使用此属性创建具有 3 条或更多边的多边形。小于 3 的值将不会被表示,且段数将自动计算。

请注意,是否调用 close 由您决定。如果您选择关闭图形,请使用 close_mode 来定义图形的闭合方式,即通过 ``"straight-line"``(直线连接)或 ``"center-connected"``(中心连接)进行闭合。

例如,要构建一个简单的椭圆,在Python中:

# simple ellipse
Line(ellipse=(0, 0, 150, 150))

# only from 90 to 180 degrees
Line(ellipse=(0, 0, 150, 150, 90, 180))

# only from 90 to 180 degrees, with few segments
Line(ellipse=(0, 0, 150, 150, 90, 180, 20))

在 1.4.1 版本加入.

在 2.2.0 版本发生变更: 现在你可以通过该属性获取生成的椭圆。

允许的最小段数为3。小于此值的设置将被忽略,段数将自动计算。

force_custom_drawing_method

如果为 True,无论宽度如何,线条都将使用自定义绘制方法绘制。

在 2.3.0 版本加入.

joint

确定线条的连接方式,默认为'round'。可选值为'none'、'round'、'bevel'、'miter'。

在 1.4.1 版本加入.

joint_precision

绘制“圆角”关节的迭代次数,默认为10。joint_precision 必须至少为1。

在 1.4.1 版本加入.

points

用于获取/设置线条点的属性。

警告

这将始终根据新的点列表重建整个图形,这可能会非常消耗CPU资源。

rectangle

使用此属性来构建一个矩形,无需计算 points

参数必须是一个 (x, y, width, height) 的元组。

  • x 和 y 表示矩形的左下角位置。

  • width 和 height 表示尺寸。

线条会自动闭合。

用法:

Line(rectangle=(0, 0, 200, 200))

在 1.4.1 版本加入.

在 2.2.0 版本发生变更: 现在你可以通过该属性获取生成的矩形。

rounded_rectangle

使用此属性来构建一个矩形,无需计算 points

参数必须是以下形式之一的元组:

  • (x, y, width, height, corner_radius)

  • (x, y, width, height, corner_radius, resolution)

  • (x, y, width, height, corner_radius1, corner_radius2, corner_radius3, corner_radius4)

  • (x, y, width, height, corner_radius1, corner_radius2, corner_radius3, corner_radius4, resolution)

  • xy 表示矩形的左下角位置。

  • widthheight 表示尺寸。

  • corner_radius 指定用于圆角的半径,按顺时针方向依次为:左上、右上、右下、左下。

  • resolution 是用于在每个角绘制圆弧的线段数量(默认为45)。

线条会自动闭合。

用法:

Line(rounded_rectangle=(0, 0, 200, 200, 10, 20, 30, 40, 100))

在 1.9.0 版本加入.

在 2.2.0 版本发生变更: resolution 的默认值从 30 改为 45。

现在你可以通过该属性生成圆角矩形。

corner_radius 的顺序已更改,以匹配 RoundedRectangle 的 radius 属性(顺时针方向)。在之前的版本中,顺序为左下、右下、右上、左上。现在两者均为顺时针:左上、右上、右下、左下。若要保持角半径顺序而不手动更改顺序,可以使用 Python 内置方法 reversed[::-1] 来反转角半径的顺序。

width

确定线条的宽度,默认为1.0。

在 1.4.1 版本加入.

class kivy.graphics.LoadIdentity(**kwargs)

基类:ContextInstruction

指令堆栈属性(默认值为'modelview_mat')

在 1.6.0 版本加入.

stack

要使用的矩阵栈名称。可以是'modelview_mat'、'projection_mat'或'frag_modelview_mat'。

class kivy.graphics.MatrixInstruction(*args, **kwargs)

基类:ContextInstruction

matrix

矩阵属性。来自变换模块的矩阵。当发生更改时,使用此属性设置矩阵非常重要,因为它会通知上下文有关更新的信息。

stack

要使用的矩阵栈名称。可以是'modelview_mat'、'projection_mat'或'frag_modelview_mat'。

在 1.6.0 版本加入.

class kivy.graphics.Mesh(**kwargs)

基类:VertexInstruction

在OpenGL ES 2.0及我们的图形实现中,索引数量不能超过65535个。

顶点列表描述如下:

vertices = [x1, y1, u1, v1, x2, y2, u2, v2, ...]
            |            |  |            |
            +---- i1 ----+  +---- i2 ----+

如果要绘制三角形,添加3个顶点。然后可以按如下方式创建索引列表:

indices = [0, 1, 2]

在 1.1.0 版本加入.

参数:
vertices:可迭代对象

顶点列表,格式为(x1, y1, u1, v1, x2, y2, u2, v2...)。

indices:可迭代对象

格式为 (i1, i2, i3...) 的索引列表。

mode:字符串

vbo 的模式。更多信息请参阅 mode。默认为 'points'。

fmt:列表

默认情况下,顶点的格式由2D坐标(x, y)和2D纹理坐标(u, v)描述。列表中的每个元素应为元组或列表,形式如下:

(variable_name, size, type)

这将允许将顶点数据映射到GLSL指令。

[(b'v_pos', 2, 'float'), (b'v_tc', 2, 'float'),]

将允许使用

attribute vec2 v_pos; attribute vec2 v_tc;

在GLSL的顶点着色器中。

在 1.8.1 版本发生变更: 之前,verticesindices 总是会被转换为列表,现在,只有在它们未实现缓冲区接口时才会被转换为列表。因此,例如 numpy 数组、python 数组等可以直接使用,而无需创建任何额外的副本。然而,缓冲区不能是只读的(即使它们未被修改,由于 cython 的限制),并且必须在内存中是连续的。

备注

当传入 memoryview 或实现了缓冲区接口的实例时,vertices 应为浮点数缓冲区(Python 数组中的 'f' 代码),indices 应为无符号短整型缓冲区(Python 数组中的 'H' 代码)。其他格式的数组仍需要在内部进行转换,从而抵消任何潜在的性能提升。

indices

用于指定绘制网格时顶点顺序的顶点索引。

mode

用于绘制顶点/索引的VBO模式。可以是'points'、'line_strip'、'line_loop'、'lines'、'triangles'、'triangle_strip'或'triangle_fan'之一。

vertices

用于构建Mesh的x、y、u、v坐标列表。目前,Mesh指令不允许你更改顶点的格式,这意味着它仅支持x、y加上一个纹理坐标。

class kivy.graphics.Point(**kwargs)

基类:VertexInstruction

:宽度/高度为 pointsize 的2倍。

参数:
points:列表

格式为(x1, y1, x2, y2...)的点列表,其中每对坐标指定一个新点的中心。

pointsize:浮点数,默认值为1。

点的大小,从中心到边缘测量。因此,值为1.0意味着实际大小将是2.0 x 2.0。

警告

从1.0.7版本开始,顶点指令的顶点数量限制为65535个(准确来说是顶点索引)。列表中的2个条目(x, y)会被转换为4个顶点。因此,在Point()类内部,限制为2^15-2。

add_point(self, float x, float y)

向当前 points 列表中添加一个点。

如果你打算添加多个点,建议使用此方法,而不是重新分配一个新的 points 列表。重新分配新的 points 列表会重新计算并将整个缓冲区重新上传到 GPU。如果使用 add_point,则只会上传更改的部分。

points

用于获取/设置点列表中中心点的属性。每对坐标指定一个新点的中心。

pointsize

用于获取/设置点大小的属性。该大小是从中心到边缘测量的,因此值为1.0时,实际大小将为2.0 x 2.0。

class kivy.graphics.PopMatrix(*args, **kwargs)

基类:ContextInstruction

stack

要使用的矩阵栈名称。可以是'modelview_mat'、'projection_mat'或'frag_modelview_mat'。

在 1.6.0 版本加入.

class kivy.graphics.PopState(*args, **kwargs)

基类:ContextInstruction

状态栈。

在 1.6.0 版本加入.

class kivy.graphics.PushMatrix(*args, **kwargs)

基类:ContextInstruction

stack

要使用的矩阵栈名称。可以是'modelview_mat'、'projection_mat'或'frag_modelview_mat'。

在 1.6.0 版本加入.

class kivy.graphics.PushState(*args, **kwargs)

基类:ContextInstruction

状态栈。

在 1.6.0 版本加入.

class kivy.graphics.Quad(**kwargs)

基类:VertexInstruction

参数:
points:列表

格式为(x1, y1, x2, y2, x3, y3, x4, y4)的点列表。

points

用于获取/设置四边形点的属性。

class kivy.graphics.Rectangle(**kwargs)

基类:VertexInstruction

参数:
pos:列表

矩形的位置,格式为 (x, y)。

size:列表

矩形的大小,格式为(宽度,高度)。

points

用于获取绘制顶点所用点的属性。

在 2.3.0 版本加入.

pos

用于获取/设置矩形位置的属性。

size

用于获取/设置矩形大小的属性。

class kivy.graphics.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 版本加入.

在之前:

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

现在:

rc = RenderContext(use_parent_modelview=True)
use_parent_projection

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

在 1.7.0 版本加入.

在之前:

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

现在:

rc = RenderContext(use_parent_projection=True)
class kivy.graphics.Rotate(*args, **kwargs)

基类:Transform

在模型视图矩阵上。之后,您可以通过例如::来设置指令的属性。

rot.angle = 90
rot.axis = (0, 0, 1)
angle

用于获取/设置旋转角度的属性。

axis

用于获取/设置旋转轴的属性。

轴的格式为(x,y,z)。

origin

旋转的原点。

在 1.7.0 版本加入.

原点的格式可以是 (x, y) 或 (x, y, z)。

set(self, float angle, float ax, float ay, float az)

设置旋转的角度和轴。

>>> rotationobject.set(90, 0, 0, 1)

自 1.7.0 版本弃用: set() 方法不使用新的 origin 属性。

class kivy.graphics.Scale(*args, **kwargs)

基类:Transform

使用三个参数创建:

Scale(x, y, z)   # scale the axes independently

在 2.3.0 版本发生变更: 允许使用关键字参数来提供x、y和z。已移除已弃用的Scale(s),改用Scale(x, y, z)。

origin

缩放的原点。

在 1.9.0 版本加入.

原点的格式可以是 (x, y) 或 (x, y, z)。

x

用于获取/设置X轴缩放的属性。

在 1.6.0 版本发生变更.

xyz

3D 中 x、y、z 轴上的三元组缩放向量。

在 1.6.0 版本发生变更.

y

用于获取/设置Y轴缩放的属性。

在 1.6.0 版本发生变更.

z

用于获取/设置Z轴缩放比例的属性。

在 1.6.0 版本发生变更.

class kivy.graphics.SmoothEllipse(**kwargs)

基类:Ellipse

其用法与 Ellipse 相同。

备注

目前仍不支持纹理抗锯齿。因此,如果使用 texturesource 定义纹理,抗锯齿功能将被禁用。

在 2.3.0 版本加入.

default_texture

default_texture: kivy.graphics.texture.Texture

class kivy.graphics.SmoothLine(**kwargs)

基类:Line

结果。它有一些缺点:

  • 如果线条自身交叉,使用透明度绘制线条可能不会得到预期的效果。

  • capjointdash 属性不受支持。

  • 它使用带有预乘Alpha的自定义纹理。

  • 宽度小于1像素的线条不受支持:它们看起来会是一样的。

警告

这是一项未完成的工作,属于实验性质,可能会出现崩溃。

在 1.9.0 版本加入.

overdraw_width

确定线条的过度绘制宽度,默认为1.2。

premultiplied_texture(self)
class kivy.graphics.SmoothQuad(**kwargs)

基类:Quad

其用法与 Quad 相同。

备注

目前仍不支持纹理抗锯齿。因此,如果使用 texturesource 定义纹理,抗锯齿功能将被禁用。

在 2.3.0 版本加入.

default_texture

default_texture: kivy.graphics.texture.Texture

class kivy.graphics.SmoothRectangle(**kwargs)

基类:Rectangle

其用法与 Rectangle 相同。

备注

目前仍不支持纹理抗锯齿。因此,如果使用 texturesource 定义纹理,抗锯齿功能将被禁用。

在 2.3.0 版本加入.

default_texture

default_texture: kivy.graphics.texture.Texture

class kivy.graphics.SmoothRoundedRectangle(**kwargs)

基类:RoundedRectangle

其用法与 RoundedRectangle 相同。

备注

目前仍不支持纹理抗锯齿。因此,如果使用 texturesource 定义纹理,抗锯齿功能将被禁用。

在 2.3.0 版本加入.

default_texture

default_texture: kivy.graphics.texture.Texture

class kivy.graphics.SmoothTriangle(**kwargs)

基类:Triangle

其用法与 Triangle 相同。

备注

目前仍不支持纹理抗锯齿。因此,如果使用 texturesource 定义纹理,抗锯齿功能将被禁用。

在 2.3.0 版本加入.

default_texture

default_texture: kivy.graphics.texture.Texture

class kivy.graphics.StencilPop

基类:Instruction

弹出模板堆栈。更多信息请参阅模块文档。

class kivy.graphics.StencilPush(**kwargs)

基类:Instruction

信息。

clear_stencil

clear_stencil 允许在 StencilPush 阶段禁用模板清除操作。此选项实质上禁用了函数 cgl.glClearStencil(0)cgl.glClear(GL_STENCIL_BUFFER_BIT) 的调用。

如果为 True,模板将在 StencilPush 阶段被清理;如果为 False,则不会被清理。

备注

**强烈建议**设置 clear_stencil=False 以提升性能并减少 GPU 使用(尤其是在有数百条指令的情况下)。然而,如果出现任何副作用(如 StencilPush 的伪影或不准确行为),建议重新启用清除指令,设置 clear_stencil=True

在 2.3.0 版本加入.

class kivy.graphics.StencilUnUse

基类:Instruction

使用当前模板缓冲区来取消设置遮罩。

class kivy.graphics.StencilUse(**kwargs)

基类:Instruction

更多信息。

func_op

确定用于glStencilFunc()的模板操作。可以是'never'、'less'、'equal'、'lequal'、'greater'、'notequal'、'gequal'或'always'之一。

默认情况下,操作符设置为“等于”。

在 1.5.0 版本加入.

class kivy.graphics.Translate(*args, **kwargs)

基类:Transform

通过以下任一方式构造:

Translate(x, y)         # translate in just the two axes
Translate(x, y, z)      # translate in all three axes

在 2.3.0 版本发生变更: 允许使用关键字参数来提供x、y和z。

x

用于获取/设置X轴平移的属性。

xy

2元组,包含2D空间中x轴和y轴的平移向量。

xyz

3 个元组平移向量,分别对应三维空间中的 x、y 和 z 轴。

y

用于获取/设置Y轴平移的属性。

z

用于获取/设置Z轴平移的属性。

class kivy.graphics.Triangle(**kwargs)

基类:VertexInstruction

参数:
points:列表

格式为(x1,y1,x2,y2,x3,y3)的点列表。

points

用于获取/设置三角形点的属性。

class kivy.graphics.UpdateNormalMatrix

基类:ContextInstruction

根据当前的模型视图矩阵更新法线矩阵“normal_mat”。这将计算“normal_mat”uniform,公式为:inverse( transpose( mat3(mvm) ) )

在 1.6.0 版本加入.

class kivy.graphics.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 属性而不是纹理。

kivy.graphics.gl_init_resources()