专否 写文章

jerkzhang

Mar 5, 2026
Follow

记录一个pyglet多行文本的问题

本来最近想用solar2d,后来决定加快开发速度,基于pyglet自建一套游戏开发框架,以前用pyglet做过类似,整体很顺利,而且pyglet最近几年更新了很多,以前很多需要我手动写来解决的补充,都已经自动化了。但依然还是存在一些细节问题。

今天卡在一个细节问题,但影响深远。

多行文字问题。

pyglet提供了多行文字功能。

multiline=True, wrap_lines=True

这两个保持成True即可,

但是往往被忽视掉文档中的一句话:

wrap_lines:

If you expect that your document lines will be wider than the display width then pyglet can automatically wrap them to fit the width by setting this option to True. Note that wrapping only works if there are spaces in the text, so it may not be suitable for languages without spaces.

换而言之,这个自动断行是只针对有空格的国别语言的。所以,我一直用一段没有空格的中文去尝试就总是不会换行。

后来我在中文里加上了换行,也会进行换行,但是效果不好,核心因素是其换行是根据”空格“去分隔词组进行换行的。

我来继续研究一下,后续会拿出针对此问题面向中文的解决方案。



研究之后,本来想通过猴子补丁的方式来解决,后来发现是我大意了,以及忘了,好几年前好像我遇到过同样的问题。真正的关键点是:

document的wrap属性。

默认是True,其实还可以选择 False / "char" / "word"

  • True 或 "word" 就是基于空格进行分词换行
  • "char" 就是基于字符级别进行换行
  • False 就是不换行

因此,直接在document对象的属性设置时,把wrap属性设置成char即可。

# 设置全局样式(字体、颜色、字号、断行方式)
document.set_style(0, len(document.text), {
    'wrap': 'char',
    'font_name': 'Arial',
    'font_size': 36,
    'color': (255, 255, 255, 255) # 白色
})


喜欢这个文章 | 分享 | 新建跟帖