显示文字
在前面最小应用中已经展示了如何向画面中绘制文本,pyglet通过pyglet.text
模块提供了一系列文本绘制的类,Label
只是其中之一。Label
类是用来渲染输出纯文本内容的,而HTMLLabel
类则是用来输出HTML格式的内容,其可以用来输出混合样式的内容。
使用Label
和HTMLLabel
在程序中输出大量的内容是不明智的,也是不经济的。所以pyglet提供了“文档/布局”(Document/Layout)架构,这个类似于“模型/视图”(Model/View)的处理架构,大大简化了文本内容的输出。
Document
类的实例是整个架构的模型部分,用来定义内容和文字显示的样式。其中UnformattedDocument
类用于创建单一样式的文本,而FormattedDocument
类则用于创建样式可变的文本。大部分时间,FormattedDocument
会使用的更多。
FormattedDocument
类实例可以由三个函数来返回:decode_text()
、decoed_attributed()
和decode_html()
。Document
类的内容可以通过.text
属性来进行更改,例如:document.text = 'Hello, world'
;也可以使用.delete_text()
和.insert_text()
方法来进行修改。
真正将文字内容输出到画面的是TextLayout
类,不同的TextLayout
类及其子类的实例可以将同一个Document
类同时渲染在不同的位置。位于同一渲染批次的多个TextLayout
类实例会共享图形组,这使得TextLayout
适合于渲染短小且不进行变化的Document
实例。TextLayout
类的子类ScrollableTextLayout
适合于渲染指定位置与大小的文字块,并且其中的内容会发生滚动;而IncrementalTextlayout
则适合于渲染常常发生变化的大块文本内容,以及用户编辑的呈现。
TextLayout
实例的创建格式为layout = pyglet.text.layout.TextLayout(document, width, height)
。除此之外,还可以接收两个命名参数,一个是multiline
,用来指示是否支持分段;一个是wrap_lines
用来指示是否支持自动换行。
格式化文本
前面提到过,FormattedDocuemnt
可以支持文本样式,并且可以为文本中的单一字符指定样式。Textlayout
会将样式应用的范围直接应用在字符串上,而不需要预先定义样式名称。例如文本样式可以像以下方式使用:
# 获取字符索引为0的位置的样式中的字体名称
font_name = document.get_style('font_name', 0)
# 为字符串中的前五个字符设置字体和大小
document.set_style(0, 5, dict(font_name='Arial', font_size=12))
样式一般是通过一个字典类型来定义的,常用的字典键值有:
font_name
: 字体名称,由pyglet.font.load()
提供。font_size
: 字体大小。bold
: 粗体,布尔型。italic
: 斜体,布尔型。underline
: 添加下划线,布尔型。kerning
: 字符间距。baseline
: 字符偏离基线的距离,正值向上偏离,负值向下偏离。color
: 字体颜色,由四元素元组声明。background_color
: 文字背景颜色,由四元素元组声明。
如果在Layout中启用了multiline
选项,则可以使用.set_paragraph_style()
来设置段落样式,段落样式可以使用以下字典键值来声明相应的样式。
align
: 段落对齐,取值为'left'
、'center'
、'right'
。indent
: 首行缩进的距离。leading
: 每行缩进距离。line_spacing
: 行距。margin_left
: 左侧留白距离。margin_right
: 右侧留白距离。margin_top
: 头部留白距离。margin_bottom
: 尾部留白距离。tab_stops
: 水平制表符的位置。wrap
: 自动换行。
属性化文本
格式化文本虽然好用,但是在进行复杂内容排版时,总是需要确定要设定样式的文字位置。这种时候属性化文本就会变得更加方便易用。属性化文本类似于HTML,使用类似于标签的语法来声明文本中的样式。例如:
This is a {bold True}bold{bold False} text. {font_name 'Times New Roman'}{font_size 20}Hello{font_size 14}, {color (255, 0, 0, 255)}world{color (0, 0, 0, 255)}!
{.margin_left '24px'}This is a left margin paragraph!
加载字体
系统中自带字体可以通过pyglet.font.load()
来加载,并且可以将加载的字体直接定义为一个字体样式,例如:times16 = pyglet.font.load('Times New Roman', 16)
。此外关于字体设置的命名参数也都可以用来设定字体样式。
要判断一个字体是否在系统中存在,可以使用pyglet.font.have_font()
来进行检测,或者直接使用sans_serif = pyglet.font.load(('Verdana', 'Helvetica', 'Arial'), 16)
d的语法设置一个自动适配的字体设置。
对于自定义的字体,则需要使用pyglet.font.add_file()
将其加载进来,之后再使用pyglet.font.load()
完成加载和设置。自定义的字体需要跟随应用发布,可以设置为应用资源。