pyglet.text.layout

高效地呈现简单文本和格式化文档。

提供了三个布局类:

TextLayout

整个文档是在呈现之前进行布局的。该布局将与同一批中的其他布局分组(允许高效地呈现多个布局)。

对布局或文档的任何更改,甚至查询某些属性,都会导致重新布局整个文档。

ScrollableTextLayout

基于 TextLayout()

单独的组用于布局,它将布局的内容裁剪到布局矩形。此外,布局的内容可以在该矩形内使用 view_xview_y 属性。

IncrementalTextLayout

基于 ScrollableTextLayout

修改布局或文档时,仅重新布局受影响的区域。这允许对文本进行高效的交互编辑和样式设置。

实际只渲染布局的可见部分;当滚动视区时,会根据需要渲染和丢弃其他部分。这允许高效地查看和编辑大型文档。

此外,此类还提供了用于定位插入符号在文档中的位置以及用于显示交互式文本选择的方法。

这三个布局类都可以与以下任一类一起使用 UnformattedDocumentFormattedDocument ,并且可以是单行或 multiline 。这些选项的组合有效地提供了12种不同的文本显示可能性。

样式属性

布局类可以识别以下字符样式属性名称。数据类型和单位是指定的。

如果属性被标记为“as a Distance”,则假定该值以像素为单位(如果以整型或浮点型给出),否则为以下形式的字符串 "0u" 是必需的,其中 0 是距离和 u 是单位;其中之一 "px" (像素), "pt" (积分), "pc" (Picas), "cm" (厘米), "mm" (毫米)或 "in" (英寸)。例如, "14pt" 是覆盖14个点的距离,在默认DPI为96时为18个像素。

font_name

字体系列名称,指定给 pyglet.font.load()

font_size

字体大小,以磅为单位。

bold

布尔型。

italic

布尔型。

underline

范围(0,255)中的整数数组,提供RGBA下划线颜色,或无(默认),表示不带下划线。

kerning

要在字形之间插入的附加空格,如距离。默认为0。

baseline

字形基线与直线基线的偏移量,如距离。正值表示上标,负值表示下标。默认为0。

color

范围(0,255)中的四元组整数,提供RGBA文本颜色

background_color

范围(0,255)中的四元组整数,提供RGBA文本背景颜色;或 None 用于无背景填充。

可识别以下段落样式属性名称。请注意,文档对段落样式的处理与对字符样式的处理没有什么不同:应用程序负责在整个段落上设置样式,否则结果不确定。

align

left (默认), centerright

indent

要在段落第一行的第一个字形之前插入的附加水平空格,如距离。

leading

在段落内的连续行之间插入的附加空格,如距离。默认为0。

line_spacing

距离段落中连续基线之间的距离,如距离默认为 None ,它会根据字体的升降自动计算每行的最紧行距。

margin_left

左段边距,如距离。

margin_right

右段页边距,如距离。

margin_top

段落上方的页边距,如距离。

margin_bottom

段落下方的页边距,如距离。相邻页边距不会折叠。

tab_stops

从文本布局的左边缘测量的水平制表位列表,以距离表示。默认为空列表。当制表位用完时,它们隐式地以50像素的间隔继续。

wrap

charword 、True(默认)或False。为防止文本溢出而对文本进行换行的边界。使用 char ,该行在文本中的任意位置换行;使用 word 或为True,则该行在单词之间的适当边界处换行;如果为False,则该行不会换行,并且可能会溢出布局宽度。 charword 样式是从pyglet1.2开始的。

其他属性可用于在文档中存储其他样式信息;内置文本类将忽略这些属性。

在 1.1 版本加入.

class IncrementalTextDecorationGroup(program: ShaderProgram, order: int = 0, parent: graphics.Group | None = None)
scissor_area = (0, 0, 0, 0)
class IncrementalTextLayout(document: AbstractDocument, width: int, height: int, x: float = 0, y: float = 0, z: float = 0, anchor_x: AnchorX = 'left', anchor_y: AnchorY = 'bottom', rotation: float = 0, multiline: bool = False, dpi: float | None = None, batch: Batch | None = None, group: Group | None = None, program: ShaderProgram | None = None, wrap_lines: bool = True)

适合交互编辑和/或滚动大型文档的显示文本。

不像 TextLayout()ScrollableTextLayout 时,此类仅为可见的文本行生成顶点列表。滚动文档时,会根据需要删除和创建顶点列表,以将视频内存使用量保持在最低水平并提高渲染速度。

对文档的更改会迅速反映在此版面中,因为只有受影响的行(S)会被重排。使用 begin_updateend_update 以进一步减少所需的处理量。

布局还可以显示文本选择(具有不同背景颜色的文本)。这个 Caret 类实现可见的文本光标,并提供用于滚动、选择和编辑增量文本布局中的文本的事件处理程序。

decoration_class

IncrementalTextDecorationGroup 的别名

group_class

IncrementalTextLayoutGroup 的别名

delete() None

从其批次中删除此版面。

ensure_line_visible(line_idx: int) None

调整 view_y 以便具有给定索引的线是可见的。

参数:
line集成

行索引。

ensure_x_visible(x: int) None

调整 view_x 因此给定的X坐标是可见的。

X坐标是相对于当前 view_x

参数:
x集成

X坐标

get_line_count() int

获取文本布局中的行数。

返回类型:

int

get_line_from_point(x, y)

获取与点最接近的线索引。

参数:
x集成

X坐标。

y集成

Y坐标。

返回类型:

int

get_line_from_position(position)

获取文档中字符位置的行索引。

参数:
position集成

文档位置。

返回类型:

int

get_point_from_line(line)

获取线索引的X、Y坐标。

参数:
line集成

行索引。

返回类型:

(int, int)

返回:

(X,Y)

get_point_from_position(position, line=None)

获取文档中某个位置的X、Y坐标。

结束一条线的位置有一个模糊点:它可以是这条线的终点,也可以是下一条线的起点。您可以选择指定行索引来消除大小写的歧义。

生成的Y坐标提供了直线的基线。

参数:
position集成

文档中的字符位置。

line集成

行索引。

返回类型:

(int, int)

返回:

(X,Y)

get_position_from_line(line)

获取给定行索引的第一个文档字符位置。

参数:
line集成

行索引。

返回类型:

int

get_position_from_point(x: float, y: float) int

获取最接近某点的文档位置。

参数:
x集成

X坐标

y集成

Y坐标

get_position_on_line(line_idx: int, x: float) int

获取给定行索引和X坐标的最接近文档位置。

参数:
line集成

行索引。

x集成

X坐标。

返回类型:

int

on_delete_text(start: int, end: int) None

的事件处理程序 AbstractDocument.on_delete_text

事件处理程序由文本布局绑定;应用程序不需要与此方法交互。

on_insert_text(start: int, text: str) None

的事件处理程序 AbstractDocument.on_insert_text

事件处理程序由文本布局绑定;应用程序不需要与此方法交互。

on_layout_update()

部分或全部布局文本已重排。

文本回流是由文档编辑或版面大小更改引起的。对版面位置或活动选定内容的更改以及某些文档编辑(如文本颜色)不会导致重排。

处理此事件可更新图形元素的位置,该位置取决于字形或线条的布局位置。

活动:

on_style_text(start: int, end: int, attributes: dict[str, Any]) None

的事件处理程序 AbstractDocument.on_style_text

事件处理程序由文本布局绑定;应用程序不需要与此方法交互。

set_selection(start: int, end: int) None

设置文本选择范围。

如果 start 相等 end 不会显示任何选择。

参数:
start集成

选定内容的起始字符位置。

end集成

选择结束,独家。

property anchor_x: Literal['left', 'center', 'right']

水平锚点对齐。

此属性确定 x 协调。它是枚举数之一:

"left" (违约)

X坐标给出布局左边缘的位置。

"center"

X坐标给出了布局中心的位置。

"right"

X坐标给出布局的右边缘的位置。

为了计算由该路线产生的位置,布局的宽度被视为 width 如果 multiline 是真的并且 wrap_lines 为True,否则为 content_width

类型:

应力

property anchor_y: Literal['top', 'bottom', 'center', 'baseline']

垂直锚点对齐。

此属性确定 y 协调。它是枚举数之一:

"top"

Y坐标给出布局顶边的位置。

"center"

Y坐标给出了布局中心的位置。

"baseline"

Y坐标提供布局中第一行文本的基线位置。

"bottom" (违约)

Y坐标提供布局的底边的位置。

为了计算由该路线产生的位置,布局的高度被视为以下最小的 heightcontent_height

另请参阅 content_valign

类型:

应力

event_types = ['on_layout_update', 'on_translation_update']
glyphs: List[Any]
property height: int

定义的布局最大高度(以像素为单位),或无

什么时候 height 不是None,则它会影响文本的位置 anchor_ycontent_valign 都被使用过。

类型:

集成

invalid_flow: _InvalidRange
invalid_glyphs: _InvalidRange
invalid_lines: _InvalidRange
invalid_style: _InvalidRange
invalid_vertex_lines: _InvalidRange
lines: List[_Line]
property multiline: bool

设置是否启用多行布局。

如果Multiline为FALSE,则会忽略换行符和段落字符,并且文本不会自动换行。如果为True,则文本仅在 wrap_lines 是真的。

类型:

布尔尔

owner_runs: runlist.RunList
property position: Tuple[float, float, float]

布局的(X,Y,Z)坐标,作为一个元组。

另请参阅 anchor_x ,以及 anchor_y

类型:

(int,int,int)

property rotation: float

布局的旋转。

类型:

浮动

property selection_background_color: Tuple[int, int, int, int]

活动选定内容的背景色。

该颜色是一个RGBA元组,其组件在范围内 [0, 255] 。

类型:

(int,int)

property selection_color: Tuple[int, int, int, int]

活动选定内容的文本颜色。

该颜色是一个RGBA元组,其组件在范围内 [0, 255] 。

类型:

(int,int)

property selection_end: int

活动选定内容的结束位置(独占)。

看见:

set_selection

类型:

集成

property selection_start: int

活动选定内容的开始位置。

看见:

set_selection

类型:

集成

property view_x: int

水平滚动偏移量。

初始值为0,文本的左边缘将接触布局边界的左侧。如果为正值,文本将向右滚动。值将自动裁剪到范围内 [0, content_width - width]

类型:

集成

property view_y: int

垂直滚动偏移量。

初始值为0,文本的顶部将接触到布局边界的顶部(除非内容高度小于布局高度,在这种情况下 content_valign 是使用的)。

负值会导致文本向上“滚动”。范围外的值 [height - content_height, 0] 会自动在范围内进行裁剪。

类型:

集成

visible_lines: _InvalidRange
property width: int

定义的布局最大宽度(以像素为单位),或无

如果 multilinewrap_lines 为真,则 width 定义文本的换行位置。如果 multiline 为假或 wrap_lines 为False,则此属性不起作用。

类型:

集成

property x: float

布局的X坐标。

另请参阅 anchor_x

类型:

集成

property y: float

布局的Y坐标。

另请参阅 anchor_y

类型:

集成

property z: float

布局的Z坐标。

类型:

集成

class IncrementalTextLayoutGroup(texture: Texture, program: ShaderProgram, order: int = 1, parent: graphics.Group | None = None)
scissor_area = (0, 0, 0, 0)
class ScrollableTextDecorationGroup(program: ShaderProgram, order: int = 0, parent: graphics.Group | None = None)
set_state() None

应用OpenGL状态更改。

默认实现不执行任何操作。

unset_state() None

撤销OpenGL状态更改。

默认实现不执行任何操作。

scissor_area = (0, 0, 0, 0)
class ScrollableTextLayout(document: AbstractDocument, width: int, height: int, x: float = 0, y: float = 0, z: float = 0, anchor_x: AnchorX = 'left', anchor_y: AnchorY = 'bottom', rotation: float = 0, multiline: bool = False, dpi: float | None = None, batch: Batch | None = None, group: graphics.Group | None = None, program: ShaderProgram | None = None, wrap_lines: bool = True)

在可滚动的视区中显示文本。

此类不显示滚动条或处理滚动事件;它只剪辑将绘制在 TextLayout() 给出的布局的边界 xywidthheight ;并将文本偏移滚动偏移量。

使用 view_xview_y 在视口中滚动文本。

decoration_class

ScrollableTextDecorationGroup 的别名

group_class

ScrollableTextLayoutGroup 的别名

property anchor_x: Literal['left', 'center', 'right']

水平锚点对齐。

此属性确定 x 协调。它是枚举数之一:

"left" (违约)

X坐标给出布局左边缘的位置。

"center"

X坐标给出了布局中心的位置。

"right"

X坐标给出布局的右边缘的位置。

为了计算由该路线产生的位置,布局的宽度被视为 width 如果 multiline 是真的并且 wrap_lines 为True,否则为 content_width

类型:

应力

property anchor_y: Literal['top', 'bottom', 'center', 'baseline']

垂直锚点对齐。

此属性确定 y 协调。它是枚举数之一:

"top"

Y坐标给出布局顶边的位置。

"center"

Y坐标给出了布局中心的位置。

"baseline"

Y坐标提供布局中第一行文本的基线位置。

"bottom" (违约)

Y坐标提供布局的底边的位置。

为了计算由该路线产生的位置,布局的高度被视为以下最小的 heightcontent_height

另请参阅 content_valign

类型:

应力

property position: Tuple[float, float, float]

布局的(X,Y,Z)坐标,作为一个元组。

另请参阅 anchor_x ,以及 anchor_y

类型:

(int,int,int)

property view_x: int

水平滚动偏移量。

初始值为0,文本的左边缘将接触布局边界的左侧。如果为正值,文本将向右滚动。值将自动裁剪到范围内 [0, content_width - width]

类型:

集成

property view_y: int

垂直滚动偏移量。

初始值为0,文本的顶部将接触到布局边界的顶部(除非内容高度小于布局高度,在这种情况下 content_valign 是使用的)。

负值会导致文本向上“滚动”。范围外的值 [height - content_height, 0] 会自动在范围内进行裁剪。

类型:

集成

property x: float

布局的X坐标。

另请参阅 anchor_x

类型:

集成

property y: float

布局的Y坐标。

另请参阅 anchor_y

类型:

集成

property z: float

布局的Z坐标。

类型:

集成

class ScrollableTextLayoutGroup(texture: Texture, program: ShaderProgram, order: int = 1, parent: graphics.Group | None = None)
set_state() None

应用OpenGL状态更改。

默认实现不执行任何操作。

unset_state() None

撤销OpenGL状态更改。

默认实现不执行任何操作。

scissor_area = (0, 0, 0, 0)
class TextDecorationGroup(program: ShaderProgram, order: int = 0, parent: graphics.Group | None = None)
set_state() None

应用OpenGL状态更改。

默认实现不执行任何操作。

unset_state() None

撤销OpenGL状态更改。

默认实现不执行任何操作。

class TextLayout(document: AbstractDocument, width: int | None = None, height: int | None = None, x: float = 0, y: float = 0, z: float = 0, anchor_x: AnchorX = 'left', anchor_y: AnchorY = 'bottom', rotation: float = 0, multiline: bool = False, dpi: float | None = None, batch: Batch = None, group: graphics.Group | None = None, program: ShaderProgram | None = None, wrap_lines: bool = True, init_document: bool = True)

布局和显示文档。

此类用于显示不定期更改的文档--任何更改都需要花费一些时间来重新布局完整的文档并重新生成所有顶点列表。

这个类的好处是纹理状态在这个类的所有布局之间共享。是时候画一张了 TextLayout() 可能与画一个的时间大致相同 IncrementalTextLayout ;但是画了十张 TextLayout() 一批对象比绘制十个增量或可滚动的文本布局要快得多。

Label()HTMLLabel() 为此类提供一个方便的接口。

变量:
content_width集成

布局中文本的计算宽度。如果换行失败,这可能会溢出所需的宽度。

content_height集成

计算出的布局中文本高度。

group_class~pyglet.graphics.Group

顶层渲染组。

background_decoration_group~pyglet.graphics.Group

背景色的渲染组。

foreground_decoration_group~pyglet.graphics.Group

字形下划线的渲染组。

decoration_class

TextDecorationGroup 的别名

group_class

TextLayoutGroup 的别名

begin_update() None

表示即将对布局或文档进行多项更改。

调用之间对布局或文档的更改 begin_updateend_update 不要触发任何代价高昂的文本重新布局。在以下情况下执行所有更改的重新布局 end_update 被称为。

请注意,在 begin_updateend_update 调用、值,如 content_widthcontent_height 未定义(即,它们可能会更新,也可能不会更新,以反映最新的更改)。

delete() None

从其批次中删除此版面。

draw() None

绘制此文本布局。

请注意,如果将批处理提供给构造函数,则此方法的性能会非常差。如果将此布局添加到批次中,则理想情况下应仅使用批次的Draw方法。

如果这不是它自己的批处理,则不会绘制InlineElement。

end_update() None

执行挂起的布局更改,因为 begin_update

看见 begin_update

get_as_texture(min_filter=9728, mag_filter=9728) Texture

返回绘制了TextLayout的纹理。每次调用此函数都会返回一个新纹理。~警告:仅当您了解纹理生成如何影响您的应用程序时,才建议使用。

on_delete_text(start: int, end: int) None

的事件处理程序 AbstractDocument.on_delete_text

事件处理程序由文本布局绑定;应用程序不需要与此方法交互。

on_insert_text(start: int, text: str) None

的事件处理程序 AbstractDocument.on_insert_text

事件处理程序由文本布局绑定;应用程序不需要与此方法交互。

on_style_text(start: int, end: int, attributes: dict[str, Any]) None

的事件处理程序 AbstractDocument.on_style_text

事件处理程序由文本布局绑定;应用程序不需要与此方法交互。

parse_distance(distance: str | int | float | None) int | None
property anchor_x: Literal['left', 'center', 'right']

水平锚点对齐。

此属性确定 x 协调。它是枚举数之一:

"left" (违约)

X坐标给出布局左边缘的位置。

"center"

X坐标给出了布局中心的位置。

"right"

X坐标给出布局的右边缘的位置。

为了计算由该路线产生的位置,布局的宽度被视为 width 如果 multiline 是真的并且 wrap_lines 为True,否则为 content_width

类型:

应力

property anchor_y: Literal['top', 'bottom', 'center', 'baseline']

垂直锚点对齐。

此属性确定 y 协调。它是枚举数之一:

"top"

Y坐标给出布局顶边的位置。

"center"

Y坐标给出了布局中心的位置。

"baseline"

Y坐标提供布局中第一行文本的基线位置。

"bottom" (违约)

Y坐标提供布局的底边的位置。

为了计算由该路线产生的位置,布局的高度被视为以下最小的 heightcontent_height

另请参阅 content_valign

类型:

应力

property batch: Batch

此布局分配到的批次。

如果没有分配批次,则创建并使用内部批次。

类型:

Batch

property bottom: float

布局底部的y坐标。

类型:

集成

property content_height: int

计算出的布局中文本的高度。

这是以像素为单位的文本实际高度,而不是用户定义的高度 height

property content_valign: Literal['left', 'center', 'top']

较大布局框内内容的垂直对齐方式。

此属性确定以下情况时内容在布局框中的位置 content_height 小于 height 。它是枚举数之一:

top (违约)

内容与布局框的顶部对齐。

center

内容在布局框中垂直居中。

bottom

内容与布局框底部对齐。

此属性在以下情况下不起作用 content_height 大于 height (在这种情况下,内容与顶部对齐)或 heightNone (在这种情况下,没有垂直布局框尺寸)。

类型:

应力

property content_width: int

布局中文本的计算宽度。

这是以像素为单位的文本实际宽度,而不是用户定义的宽度 width 。如果不能自动换行,则内容宽度可能会溢出布局宽度。

property document: AbstractDocument

要显示的文档。

IncrementalTextLayout 就地修改文档比替换布局上的文档实例效率高得多。

类型:

AbstractDocument

property dpi: float

获取此布局使用的DPI。

类型:

浮动

property group: Group | None
group_cache: Dict[Texture, graphics.Group]
property height: int | None

定义的布局最大高度(以像素为单位),或无

什么时候 height 不是None,则它会影响文本的位置 anchor_ycontent_valign 都被使用过。

类型:

集成

property left: float

布局左侧的x坐标。

类型:

集成

property multiline: bool

设置是否启用多行布局。

如果Multiline为FALSE,则会忽略换行符和段落字符,并且文本不会自动换行。如果为True,则文本仅在 wrap_lines 是真的。

类型:

布尔尔

property position: Tuple[float, float, float]

布局的(X,Y,Z)坐标,作为一个元组。

另请参阅 anchor_x ,以及 anchor_y

类型:

(int,int,int)

property program: ShaderProgram

分配给此布局的ShaderProgram。

如果设置该着色器,则该着色器将影响除InlineElement之外的所有文本布局。

类型:

ShaderProgram

property right: float

布局右侧的x坐标。

类型:

集成

property rotation: float

布局的旋转。

类型:

浮动

property top: float

布局顶侧的y坐标。

类型:

集成

property visible: bool

如果绘制时布局可见,则为True。

类型:

布尔尔

property width: int | None

定义的布局最大宽度(以像素为单位),或无

如果 multilinewrap_lines 为真,则 width 定义文本的换行位置。如果 multiline 为假或 wrap_lines 为False,则此属性不起作用。

类型:

集成

property x: float

布局的X坐标。

另请参阅 anchor_x

类型:

集成

property y: float

布局的Y坐标。

另请参阅 anchor_y

类型:

集成

property z: float

布局的Z坐标。

类型:

集成

class TextLayoutGroup(texture: Texture, program: ShaderProgram, order: int = 1, parent: graphics.Group | None = None)
set_state() None

应用OpenGL状态更改。

默认实现不执行任何操作。

unset_state() None

撤销OpenGL状态更改。

默认实现不执行任何操作。

get_default_decoration_shader() ShaderProgram
get_default_image_layout_shader() ShaderProgram
get_default_layout_shader() ShaderProgram