显示文字

在前面最小应用中已经展示了如何向画面中绘制文本,pyglet通过pyglet.text模块提供了一系列文本绘制的类,Label只是其中之一。Label类是用来渲染输出纯文本内容的,而HTMLLabel类则是用来输出HTML格式的内容,其可以用来输出混合样式的内容。

使用LabelHTMLLabel在程序中输出大量的内容是不明智的,也是不经济的。所以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()完成加载和设置。自定义的字体需要跟随应用发布,可以设置为应用资源。