文本布局

用于根据选项和约束条件进行文本布局的内部模块。此模块不属于API的一部分,随时可能发生变更。

class kivy.core.text.text_layout.LayoutLine

基类:object

正式描述一行文本。一行文本由多个 LayoutWord 实例组成,每个实例都有自己的文本、大小和选项。

一个 LayoutLine 实例并不总是意味着该行包含的单词以换行符结尾。只有当 is_last_line 为 True 时才是这种情况。例如,如果整行文本无法适应受限宽度,那么一行实际文本可能会被分割到多个 LayoutLine 实例中。

参数:
x:整数

纹理中此线条左侧开始绘制的位置。

y:整数

纹理中绘制此线条底部的位置。

w:整数

线条的宽度。这是其 LayoutWord 实例各自宽度的总和。不包括任何内边距。

h:整数

线条的高度。这是其 LayoutWord 实例各自高度乘以这些实例的 line_height 后所得的最大值。因此,它大于单词的高度。

is_last_line:布尔值

该行是否为段落中的最后一行。当为True时,表示该行后跟有一个换行符。换行符不应包含在单词的文本中,但通过将此设置为True来隐含表示。

line_wrap:布尔值

该行是否是从上一行延续而来,而上一行因受限于宽度未能完整显示,因此被拆分为多个 LayoutLine 实例。line_wrap 可以为 True 或 False,与 is_last_line 无关。

words:Python 列表

一个仅包含描述该行文本的 LayoutWord 实例的列表。

h

h: “int”

is_last_line

is_last_line: 'int'

line_wrap

line_wrap: 'int'

w

w: 'int'

words

words: 列表

x

x: 'int'

y

y: 'int'

class kivy.core.text.text_layout.LayoutWord

基类:object

正式描述一行中包含的一个词。这里的“词”仅指一段文本,可用于描述任何文本内容。

一个词具有宽度和高度,并根据保存在 options 中的选项进行渲染。有关其用法,请参阅 LayoutLine

参数:
options:字典

此单词的标签选项字典。

lw:整数

文本的宽度(以像素为单位)。

lh:整数

文本的高度(以像素为单位)。

text:字符串

单词的文本。

lh

lh: 'int'

lw

lw: 'int'

options

选项:字典

text

text: 对象

kivy.core.text.text_layout.layout_text(text, list lines, tuple size, tuple text_size, dict options, get_extents, int append_down, int complete)

根据指定的选项,将文本布局为一系列 LayoutWordLayoutLine 实例。

该函数设计为可多次调用,每次调用时,除非文本中包含换行符,否则新文本会追加到上一行(若向上追加则为第一行)。每次追加的文本由其自身的选项描述,这些选项可在连续调用之间变化。若文本受到约束,则一旦达到约束条件即停止。

参数:
text:字符串或字节

需要被拆分为行的文本。如果 lines 不为空,则文本会被添加到最后一行(如果 append_down 为 False,则添加到第一行),直到遇到换行符,从而在 lines 中创建新的一行。参见 LayoutLine

lines:列表

一个 LayoutLine 实例的列表,每个实例描述文本的一行。对 layout_text() 的调用会在 lines 中追加或创建新的 LayoutLine 实例。

size:2 元组,包含整数

到目前为止已布局文本的尺寸。首次调用时,它可能应为 (0, 0),之后应为该函数在先前调用中返回的 (w, h) 值。当尺寸达到约束大小 text_size 时,我们停止添加行,并为裁剪参数返回 True。尺寸包括 x 和 y 方向的内边距。

text_size:由两个整数组成的二元组,或为 None。

对布局文本的大小约束。如果任一元素为None,则该维度上的文本不受约束。例如,(None, 200) 将约束高度(包括内边距)为200,而宽度则不受限制。即使首行或某行的首字符超出约束,也始终会返回。该值可在不同调用之间更改。

options:字典

此`text`的标签选项。这些选项与每个单词一同保存,使得连续调用时不同单词可以拥有不同的选项。

注意,options 必须包含一个 space_width 键,其值表示该组选项中空格字符的宽度。

get_extents:可调用对象

一个以字符串为参数调用的函数,返回一个包含该字符串宽度和高度的元组。

append_down: 布尔值

该函数连续调用时,新行是追加在现有行之前还是之后。若为True,则追加到最后一行之下;若为False,则追加到第一行之上。例如,若为False,`text`中最后一个换行符之后的内容会追加到lines的第一行。最后一个换行符之前的内容则按原顺序插入到lines的开头;即我们不会反转行顺序。

这允许从上到下进行布局,直到达到约束条件,或者从下到上进行布局,直到达到约束条件。

complete:布尔值

该文本是否完整行。其用途是,通常当 options 中的 strip 为 True 时,每行的首尾空格都会被移除,但最后一行(或当 append_down 为 False 时的第一行)除外,该行仅移除开头的空格。这是因为后续文本仍可能追加到最后一行,因此我们无法将其去除。如果 complete 为 True,则表示不再有后续文本,所有行都将被去除首尾空格。

该函数也可以以`text`设为空字符串、`complete`设为True的方式调用,以便去除最后(第一)行。

返回:

3元组,(w, h, clipped)。w 和 h 是到目前为止文本行所占的宽度和高度,并包含内边距。这可能大于 text_size,例如,如果连一行都无法完全适配,仍会返回第一行。如果由于 w、h 达到约束尺寸而导致并非所有文本都已添加到行中,则 clipped 为 True。

以下是一个没有填充和没有去除空白的简单示例:

>>> from kivy.core.text import Label
>>> from kivy.core.text.text_layout import layout_text

>>> l = Label()
>>> lines = []
>>> # layout text with width constraint by 50, but no height constraint
>>> w, h, clipped = layout_text('heres some text\nah, another line',
... lines, (0, 0), (50, None), l.options, l.get_cached_extents(), True,
... False)
>>> w, h, clipped
(46, 90, False)
# now add text from bottom up, and constrain width only be 100
>>> w, h, clipped = layout_text('\nyay, more text\n', lines, (w, h),
... (100, None), l.options, l.get_cached_extents(), False, True)
>>> w, h, clipped
(77, 120, 0)
>>> for line in lines:
...     print('line w: {}, line h: {}'.format(line.w, line.h))
...     for word in line.words:
...         print('w: {}, h: {}, text: {}'.format(word.lw, word.lh,
...         [word.text]))
line w: 0, line h: 15
line w: 77, line h: 15
w: 77, h: 15, text: ['yay, more text']
line w: 31, line h: 15
w: 31, h: 15, text: ['heres']
line w: 34, line h: 15
w: 34, h: 15, text: [' some']
line w: 24, line h: 15
w: 24, h: 15, text: [' text']
line w: 17, line h: 15
w: 17, h: 15, text: ['ah,']
line w: 46, line h: 15
w: 46, h: 15, text: [' another']
line w: 23, line h: 15
w: 23, h: 15, text: [' line']