标签

_images/label.png

Label 组件用于渲染文本:

# hello world text
l = Label(text='Hello world')

# unicode text; can only display glyphs that are available in the font
l = Label(text='Hello world ' + chr(2764))

# multiline text
l = Label(text='Multi\nLine')

# size
l = Label(text='Hello world', font_size='20sp')

尺寸设置与文本内容

默认情况下,Label 的大小不受 text 内容的影响,文本也不受大小的影响。为了控制尺寸,您必须指定 text_size 来约束文本,和/或将 size 绑定到 texture_size 以随文本增长。

例如,这个标签的大小将被设置为文本内容(加上 padding):

Label:
    size: self.texture_size

该标签的文本将在指定宽度处换行,并裁剪至指定高度:

Label:
    text_size: cm(6), cm(4)

备注

: shortenmax_lines 属性控制溢出文本的行为方式。

结合这些概念,创建一个可以垂直增长但在特定宽度处换行的标签。

Label:
    text_size: root.width, None
    size: self.texture_size

如何在标签中设置自定义背景颜色:

# Define your background color Template
<BackgroundColor@Widget>
    background_color: 1, 1, 1, 1
    canvas.before:
        Color:
            rgba: root.background_color
        Rectangle:
            size: self.size
            pos: self.pos
# Now you can simply Mix the `BackgroundColor` class with almost
# any other widget... to give it a background.
<BackgroundLabel@Label+BackgroundColor>
    background_color: 0, 0, 0, 0
    # Default the background color for this label
    # to r 0, g 0, b 0, a 0
# Use the BackgroundLabel any where in your kv code like below
BackgroundLabel
    text: 'Hello'
    background_color: 1, 0, 0, 1

文本对齐与换行

Label 具有 halignvalign 属性来控制其文本的对齐方式。然而,默认情况下,文本图像(texture)仅足够大以容纳字符,并位于 Label 的中心。valign 属性将不起作用,而 halign 仅在文本包含换行符时才会生效;即使 halign 设置为左对齐(默认值),单行文本也会显示为居中。

为了使对齐属性生效,请设置 text_size,它指定了文本对齐的边界框大小。例如,以下代码将此大小绑定到 Label 的大小,因此文本将在控件边界内对齐。这也会自动换行 Label 的文本,使其保持在该区域内。

Label:
    text_size: self.size
    halign: 'right'
    valign: 'middle'

标记文本

在 1.1.0 版本加入.

您可以使用 文本标记 来改变文本的样式。其语法类似于bbcode语法,但仅允许内联样式,如下所示:

# hello world with world in bold
l = Label(text='Hello [b]World[/b]', markup=True)

# hello in red, world in blue
l = Label(text='[color=ff3333]Hello[/color][color=3333ff]World[/color]',
    markup = True)

如果你需要从当前文本中转义标记,请使用 kivy.utils.escape_markup():

text = 'This is an important message [1]'
l = Label(text='[b]' + escape_markup(text) + '[/b]', markup=True)

可用的标签如下:

[b][/b]

激活粗体文本

[i][/i]

激活斜体文本

[u][/u]

带下划线的文本

[s][/s]

删除线文本

[font=<str>][/font]

更改字体(注意:此处指的是TTF文件或已注册的别名)

[font_context=<str>][/font_context]

更改字体的上下文,使用字符串值“none”表示隔离上下文(这等同于`None`;如果你创建了一个名为`'none'`的字体上下文,则无法通过标记来引用它)。

[font_family=<str>][/font_family]

请求用于绘制的字体族。这仅在字体上下文(font context)下有效,详见 kivy.uix.label.Label

[font_features=<str>][/font_features]

OpenType 字体特性,以 CSS 格式表示,此内容直接传递给 Pango。请求特性的效果取决于加载的字体、库版本等。仅限 Pango,要求版本 1.38 或更高。

[size=<整数>][/size]

修改字体大小

[color=#<color>][/color]

更改文本颜色

[ref=<str>][/ref]

添加一个交互区域。该参考及其内部的边界框将可在 Label.refs 中使用。

[anchor=<str>]

在文本中放置一个锚点。您可以通过 Label.anchors 获取锚点在文本中的位置。

[sub][/sub]

将文本显示在其前一个文本的下标位置。

[sup][/sup]

将文本显示为相对于其前文本的上标位置。

[text_language=<str>][/text_language]

文本的语言,这是一个RFC-3066格式的语言标签(作为字符串),例如“en_US”、“zh_CN”、“fr”或“ja”。这会影响字体选择和度量。使用字符串“None”可恢复为区域设置检测。仅限Pango。

如果你想要渲染包含 []& 字符的标记文本,你需要对它们进行转义。我们创建了一个简单的语法:

[   -> &bl;
]   -> &br;
&   -> &amp;

然后你可以这样写:

"[size=24]Hello &bl;World&br;[/size]"

文本中的交互区域

在 1.1.0 版本加入.

现在,您可以使用文本标记来定义“链接”。其理念是能够检测用户点击文本的某一部分并作出反应。为此,使用标签 [ref=xxx]

在此示例中,我们为单词“World”创建了一个引用。当该单词被点击时,将调用函数``print_it``,并传入该引用的名称:

def print_it(instance, value):
    print('User clicked on', value)
widget = Label(text='Hello [ref=world]World[/ref]', markup=True)
widget.bind(on_ref_press=print_it)

为了更美观的渲染效果,你可以为引用添加颜色。将之前示例中的 text= 替换为:

'Hello [ref=world][color=0000ff]World[/color][/ref]'

支持Unicode语言

Kivy 使用的字体并不包含显示所有语言所需的全部字符。当您使用内置组件时,这会导致在您期望显示字符的位置绘制出一个方块。

如果您需要显示这些字符,可以选择一款支持它们的字体,并通过kv文件全局部署该字体。

<Label>:
    font_name: '/<path>/<to>/<font>'

请注意,这需要在你的控件加载之前完成,因为kv规则仅在加载时应用。

使用示例

以下示例标记了标签中包含的锚点和引用:

from kivy.app import App
from kivy.uix.label import Label
from kivy.clock import Clock
from kivy.graphics import Color, Rectangle


class TestApp(App):

    @staticmethod
    def get_x(label, ref_x):
        """ Return the x value of the ref/anchor relative to the canvas """
        return label.center_x - label.texture_size[0] * 0.5 + ref_x

    @staticmethod
    def get_y(label, ref_y):
        """ Return the y value of the ref/anchor relative to the canvas """
        # Note the inversion of direction, as y values start at the top of
        # the texture and increase downwards
        return label.center_y + label.texture_size[1] * 0.5 - ref_y

    def show_marks(self, label):

        # Indicate the position of the anchors with a red top marker
        for name, anc in label.anchors.items():
            with label.canvas:
                Color(1, 0, 0)
                Rectangle(pos=(self.get_x(label, anc[0]),
                               self.get_y(label, anc[1])),
                          size=(3, 3))

        # Draw a green surround around the refs. Note the sizes y inversion
        for name, boxes in label.refs.items():
            for box in boxes:
                with label.canvas:
                    Color(0, 1, 0, 0.25)
                    Rectangle(pos=(self.get_x(label, box[0]),
                                   self.get_y(label, box[1])),
                              size=(box[2] - box[0],
                                    box[1] - box[3]))

    def build(self):
        label = Label(
            text='[anchor=a]a\nChars [anchor=b]b\n[ref=myref]ref[/ref]',
            markup=True)
        Clock.schedule_once(lambda dt: self.show_marks(label), 1)
        return label

TestApp().run()
class kivy.uix.label.Label(**kwargs)[源代码]

基类:Widget

Label 类,更多信息请参阅模块文档。

事件:
on_ref_press

当用户点击文本标记中带有``[ref]``标签引用的单词时触发。

anchors

在 1.1.0 版本加入.

文本中所有``[anchor=xxx]``标记的位置。这些坐标相对于文本左上角,y值向下递增。锚点名称应唯一,且仅记录任何重复锚点的首次出现位置。

您可以按照以下方式在标记文本中放置锚点:

text = """
    [anchor=title1][size=24]This is my Big title.[/size]
    [anchor=content]Hello world
"""

然后,所有 [anchor=] 引用将被移除,你将在此属性中获得所有锚点位置(仅在渲染后)::

>>> widget = Label(text=text, markup=True)
>>> widget.texture_update()
>>> widget.anchors
{"content": (20, 32), "title1": (20, 16)}

备注

这仅适用于标记文本。您需要将 markup 设置为 True。

base_direction

文本的基础方向,这会影响当 halign`auto`(默认值)时的水平对齐方式。可用选项有:None、"ltr"(从左到右)、"rtl"(从右到左),以及 "weak_ltr" 和 "weak_rtl"。

备注

此功能需要Pango文本提供程序。

备注

Kivy 文本布局目前尚未实现弱模式,其效果与设置强模式相同。

在 1.11.0 版本加入.

base_direction 是一个 OptionProperty,默认值为 None(如果可能则自动检测从右到左,否则为从左到右)。

bold

指示使用字体的粗体版本。

备注

根据您使用的字体,粗体属性可能对文本渲染没有影响。

bold 是一个 BooleanProperty,默认值为 False。

color

文本颜色,格式为(r, g, b, a)。

color 是一个 ColorProperty,默认值为 [1, 1, 1, 1]。

在 2.0.0 版本发生变更: ListProperty 更改为 ColorProperty

disabled_color

当控件被禁用时文本的颜色,格式为 (r, g, b, a)。

在 1.8.0 版本加入.

disabled_color 是一个 ColorProperty,默认值为 [1, 1, 1, .3]。

在 2.0.0 版本发生变更: ListProperty 更改为 ColorProperty

disabled_outline_color

当控件被禁用时,文本轮廓的颜色,格式为 (r, g, b)。

备注

此功能需要SDL2文本提供程序。

在 1.10.0 版本加入.

disabled_outline_color 是一个 ColorProperty,默认值为 [0, 0, 0]。

在 2.0.0 版本发生变更: ListProperty 更改为 ColorProperty。Alpha 分量被忽略,对其赋值不会产生任何效果。

ellipsis_options

用于分割文本的省略号字符串('...')的字体选项。

接受一个字典作为选项名及其值。仅在 markup 为真且文本被缩短时应用。所有适用于 Label 的字体选项同样适用于 ellipsis_options。未指定的选项默认值取自周围文本。

Label:
    text: 'Some very long line which will be cut'
    markup: True
    shorten: True
    ellipsis_options: {'color':(1,0.5,0.5,1),'underline':True}

在 2.0.0 版本加入.

ellipsis_options 是一个 DictProperty,默认值为 `{}`(空字典)。

font_blended

是否应使用混合或实心字体渲染。

备注

此功能需要SDL2文本提供程序。

在 1.10.0 版本加入.

font_blended 是一个 BooleanProperty,默认值为 True。

font_context

字体上下文。None 表示字体被独立使用,因此您可以确保使用由 font_name 解析的 TTF 文件进行绘制。在此处指定值会将字体文件加载到命名上下文中,从而在同一上下文中的所有字体之间实现回退。如果设置了字体上下文,则无法保证渲染会实际使用指定的 TTF 文件来绘制所有字形(Pango 将选择它认为最合适的字体)。

如果 Kivy 链接到了系统级安装的 FontConfig,你可以通过指定以特殊字符串 system:// 开头的字体上下文来加载系统字体。这将加载系统的 fontconfig 配置,并在其之上添加你的应用程序特定字体(这会带来显著的字体族名称冲突风险,Pango 可能不会使用你的自定义字体文件,而是从系统中选择一个)。

备注

此功能需要Pango文本提供程序。

在 1.11.0 版本加入.

font_context 是一个 StringProperty,默认值为 None。

font_direction

特定字体的方向,可以是 ltrrtlttbbtt 之一。

font_direction 目前仅适用于 SDL2 ttf 提供程序。

在 2.2.0 版本加入.

font_direction 是一个 OptionProperty,默认值为 'ltr'。

font_family

字体族,此选项仅在启用 font_context 时适用。将请求指定的字体族,但请注意,该字体可能不可用,或者可能存在多个以相同族名注册的字体。该值可以是字体上下文中可用的族名(字符串)(例如,system:// 上下文中的系统字体,或使用 kivy.core.text.FontContextManager 添加的自定义字体文件)。如果设置为 None,则字体选择由 font_name 设置控制。

备注

如果使用 font_name 引用自定义字体文件,应将其保留为 None。在这种情况下,字体族名称会自动管理。

备注

此功能需要Pango文本提供程序。

在 1.11.0 版本加入.

font_family 是一个 StringProperty,默认值为 None。

font_features

OpenType字体特性,以CSS格式表示,此内容直接传递给Pango。请求特定特性的效果取决于加载的字体、库版本等。有关特性的完整列表,请参阅:

https://en.wikipedia.org/wiki/List_of_typographic_features

备注

此功能需要Pango文本提供程序,以及Pango库v1.38或更高版本。

在 1.11.0 版本加入.

font_features 是一个 StringProperty,默认值为空字符串。

font_hinting

用于字体渲染的提示选项。可以是 'normal''light''mono' 或 None。

备注

此功能需要SDL2或Pango文本提供程序。

在 1.10.0 版本加入.

font_hinting 是一个 OptionProperty,默认值为 'normal'

font_kerning

是否启用字体渲染的字距调整。通常只有在特定字体文件渲染出现问题时,才应禁用此功能。

备注

此功能需要SDL2文本提供程序。

在 1.10.0 版本加入.

font_kerning 是一个 BooleanProperty,默认值为 True。

font_name

要使用的字体文件名。路径可以是绝对路径或相对路径。相对路径由 resource_find() 函数解析。

警告

根据您的文本提供者,字体文件可能会被忽略。然而,您通常可以毫无问题地使用它。

如果所使用的字体缺少您正在使用的特定语言/符号的字形,您将看到“[]”空白框字符,而不是实际字形。解决方案是使用包含您需要显示的字形的字体。例如,要显示|unicodechar|,请使用像freesans.ttf这样包含该字形的字体。

font_name 是一个 StringProperty,默认值为 'Roboto'。该值取自 Config

font_script_name

script_code 来自 https://bit.ly/TypeScriptCodes

在 2.2.0 版本加入.

警告

font_script_name 目前仅在 SDL2 ttf 提供程序中受支持。

font_script_name 是一个 OptionProperty,默认值为 'Latn'。

font_size

文本的字体大小,以像素为单位。

font_size 是一个 NumericProperty,默认值为 15sp。

halign

文本的水平对齐方式。

halign 是一个 OptionProperty,默认值为 'auto'。可用选项包括:auto、left、center、right 和 justify。auto 会尝试自动检测从右到左(RTL)文本的水平对齐方式(仅限 Pango),否则其行为与 left 相同。

警告

这不会改变Label的文本纹理位置(居中),只会改变该纹理中文本的位置。你可能希望将Label的大小绑定到:attr:texture_size,或者设置一个:attr:text_size

在 1.10.1 版本发生变更: 添加了 auto 选项

在 1.6.0 版本发生变更: halign 新增了一个选项,即 justify

is_shortened

该属性指示当 shorten 为 True 时,text 是否在渲染时进行了缩短处理。

在 1.10.0 版本加入.

is_shortened 是一个 BooleanProperty,默认值为 False。

italic

指示使用字体的斜体版本。

备注

根据您使用的字体,斜体属性可能对文本渲染没有影响。

italic 是一个 BooleanProperty,默认值为 False。

limit_render_to_text_bbox

如果设置为 True,此参数表示渲染应限制在文本的边界框内,不包括为上升和下降预留的任何额外空白。

通过将渲染限制在文本的边界框内,在使用诸如`valign`、ypos`pos_hint`等属性时,它能确保与周围元素更精确的对齐。

备注

此功能需要PIL文本提供程序。

limit_render_to_text_bbox 是一个 BooleanProperty,默认值为 False。

line_height

文本的行高。例如,line_height = 2 将使行间距变为原来的两倍。

line_height 是一个 NumericProperty,默认值为 1.0。

在 1.5.0 版本加入.

markup

在 1.1.0 版本加入.

如果为 True,文本将使用 MarkupLabel 进行渲染:你可以通过标签来改变文本的样式。更多信息请参阅 文本标记 文档。

markup 是一个 BooleanProperty,默认值为 False。

max_lines

最大行数,默认为0,表示无限制。请注意,shorten 会覆盖此属性。(使用 shorten 时,文本始终为单行。)

在 1.8.0 版本加入.

max_lines 是一个 NumericProperty,默认值为 0。

mipmap

指示是否对纹理应用OpenGL mipmapping。更多信息请阅读 Mipmapping(多级纹理映射)

在 1.0.7 版本加入.

mipmap 是一个 BooleanProperty,默认值为 False。

on_touch_down(touch)[源代码]

接收触摸按下事件。

参数:
touchMotionEvent

收到触摸事件。该触摸位于父级坐标系中。关于坐标系统的讨论,请参阅 relativelayout

返回:

bool 如果为 True,触摸事件的派发将停止。如果为 False,事件将继续派发给控件树中的其余部分。

outline_color

文本轮廓的颜色,格式为(r,g,b)。

备注

此功能需要SDL2文本提供程序。

在 1.10.0 版本加入.

outline_color 是一个 ColorProperty,默认值为 [0, 0, 0, 1]。

在 2.0.0 版本发生变更: ListProperty 更改为 ColorProperty。Alpha 分量被忽略,对其赋值不会产生任何效果。

outline_width

文本周围轮廓的宽度(以像素为单位)。如果值为None,则不渲染轮廓。

备注

此功能需要SDL2文本提供程序。

在 1.10.0 版本加入.

outline_width 是一个 NumericProperty,默认值为 None。

padding

文本的内边距,格式为 [padding_left, padding_top, padding_right, padding_bottom]

padding 也接受双参数形式 [padding_horizontal, padding_vertical] 和单参数形式 [padding]。

在 2.2.0 版本发生变更: 已将 ReferenceListProperty 替换为 VariableListProperty。

padding 是一个 VariableListProperty,默认值为 [0, 0, 0, 0]。

padding_x

控件框内文本的水平内边距。

padding_x 是一个 NumericProperty,默认值为 0。

在 1.9.0 版本发生变更: padding_x 已修复,现在能按预期工作。过去,文本会按其值的负数进行填充。

自 2.2.0 版本弃用: 请使用 padding 代替。

padding_y

控件框内文本的垂直内边距。

padding_y 是一个 NumericProperty,默认值为 0。

在 1.9.0 版本发生变更: padding_y 已修复,现在能按预期工作。过去,文本会按其值的负数进行填充。

自 2.2.0 版本弃用: 请使用 padding 代替。

refs

在 1.1.0 版本加入.

文本中所有``[ref=xxx]``标记项的列表,包含每个引用内所有单词的边界框,仅在渲染后可用。

例如,如果你写了:

Check out my [ref=hello]link[/ref]

refs 将通过以下方式设置:

{'hello': ((64, 0, 78, 16), )}

标记为“hello”的引用具有一个边界框,坐标为(x1, y1, x2, y2)。这些坐标相对于文本左上角,y值向下递增。您可以定义多个同名引用:每次出现都会作为另一个(x1, y1, x2, y2)元组添加到该列表中。

当前Label实现会在您的标记文本中存在这些引用时自动使用它们,处理触摸碰撞并分发`on_ref_press`事件。

你可以像这样绑定一个ref事件:

def print_it(instance, value):
    print('User click on', value)
widget = Label(text='Hello [ref=world]World[/ref]', markup=True)
widget.bind(on_ref_press=print_it)

备注

这仅适用于标记文本。您需要将 markup 设置为 True。

shorten

指示在给定 text_size 的情况下,标签是否应尽可能缩短其文本内容。若将此设置为 True 而未适当设置 text_size,将导致意外结果。

shorten_fromsplit_str 控制 text 被分割的方向,以及允许在 text 中的哪个位置进行分割。

shorten 是一个 BooleanProperty,默认值为 False。

shorten_from

缩短文本时应从哪一侧进行,可以是左侧、右侧或中心。

例如,如果设置为 left,省略号将出现在左侧,我们会尽可能多地显示从右侧开始的文本。与 shorten 类似,此选项仅在 text_size [0] 不为 None 时生效,在这种情况下,字符串会被缩短以适应指定的宽度。

在 1.9.0 版本加入.

shorten_from 是一个 OptionProperty,默认值为 center

split_str

用于在 shorten 为 True 时缩短字符串时分割 text 的字符串。

例如,如果分隔符是空格,字符串将被拆分为单词,并尽可能将能容纳在一行内的完整单词显示出来。如果 split_str 是空字符串 '',则我们按每个字符进行拆分,尽可能将更多文本放入一行中。

在 1.9.0 版本加入.

split_str 是一个 StringProperty,默认值为 `''`(空字符串)。

strikethrough

为文本添加删除线。

备注

此功能需要SDL2文本提供程序。

在 1.10.0 版本加入.

strikethrough 是一个 BooleanProperty,默认值为 False。

strip

是否应从每个显示行中去除前导和尾随空格及换行符。若为True,则每行将从右边缘或左边缘开始,具体取决于:attr:halign。若:attr:halign`为`justify,则此属性隐式为True。

在 1.9.0 版本加入.

strip 是一个 BooleanProperty,默认值为 False。

text

标签的文本。

创建一个简单的“Hello World”程序:

widget = Label(text='Hello world')

text 是一个 StringProperty,默认值为 ''。

text_language

文本的语言,若为None,Pango将根据区域设置自动确定。这是一个RFC-3066格式的语言标签(字符串形式),例如"en_US"、"zh_CN"、"fr"或"ja"。这会影响字体选择、度量和渲染。例如,相同的文本字节在`ur`和`ar`语言下可能看起来不同,尽管两者都使用阿拉伯文字。

备注

此功能需要Pango文本提供程序。

在 1.11.0 版本加入.

text_language 是一个 StringProperty,默认值为 None。

text_size

默认情况下,标签不受任何边界框的约束。您可以通过此属性设置标签的大小约束。文本将自动适应这些约束进行排版。因此,尽管字体大小不会被缩小,但文本会尽可能排列以适应框内,超出框外的任何文本将被裁剪。

如果 text_size 不为 None,则设置并裁剪 texture_size 为 text_size。

在 1.0.4 版本加入.

例如,无论当前控件尺寸如何,如果您希望标签在一个宽度为200、高度无限的盒子中创建::

Label(text='Very big big line', text_size=(200, None))

备注

text_size 属性与 Label 类中的 usersize 属性相同。(在构造函数中它被命名为 size=。)

text_size 是一个 ListProperty,默认值为 (None, None),表示默认情况下没有尺寸限制。

texture

文本的纹理对象。当属性发生变化时,文本会自动渲染。此操作中创建的OpenGL纹理存储在该属性中。您可以将此 texture 用于任何图形元素。

根据纹理创建方式的不同,该值将是一个 TextureTextureRegion 对象。

警告

texture 的更新被安排在下一帧。如果你在更改属性后需要立即获取纹理,则必须在访问 texture 之前调用 texture_update() 方法::

l = Label(text='Hello world')
# l.texture is good
l.font_size = '50sp'
# l.texture is not updated yet
l.texture_update()
# l.texture is good now.

texture 是一个 ObjectProperty,默认值为 None。

texture_size

文本的纹理大小。该大小由字体大小和文本决定。如果 text_size 为 [None, None],则纹理大小将适应文本所需的大小;否则,纹理将被裁剪以适应 text_size

text_size 为 [None, None] 时,可以绑定到 texture_size 并按比例重新缩放,以适应标签的大小,从而使文本在标签中最大化地适配。

警告

: texture_size 是在 texture 属性之后设置的。如果你监听 texture 的变化,在你的回调函数中 texture_size 可能不是最新的。请改为绑定到 texture_size

texture_update(*largs)[源代码]

使用当前Label属性强制重新创建纹理。

在此函数调用之后,texturetexture_size 将按此顺序更新。

underline

为文本添加下划线。

备注

此功能需要SDL2文本提供程序。

在 1.10.0 版本加入.

underline 是一个 BooleanProperty,默认值为 False。

unicode_errors

如何处理Unicode解码错误。可以是`'strict''replace''ignore'`

在 1.9.0 版本加入.

unicode_errors 是一个 OptionProperty,默认值为 'replace'

valign

文本的垂直对齐方式。

valign 是一个 OptionProperty,默认值为 'bottom'。可用选项包括:'bottom''middle'`(或 `'center')和 'top'

在 1.10.0 版本发生变更: 'center' 选项已作为 'middle' 的别名添加。

警告

这不会改变Label的文本纹理位置(居中),只会改变文本在该纹理内的位置。你可能希望将Label的大小绑定到:attr:texture_size,或设置:attr:`text_size`来改变这一行为。