如何在Pyglet中加载同一字体家族的变体?

1 投票
2 回答
832 浏览
提问于 2025-04-17 16:29

我想在Pyglet中显示多个文本标签,使用不同的字体。在这个例子中,我使用的是“Ubuntu”字体,有时候是粗体,有时候是斜体。我手里有两个字体文件,分别是 Ubuntu-B.ttfUbuntu-BI.ttf

按照说明,我加载字体的方式是:

pyglet.font.add_file(font_filename)

然后我用它的名称来使用(我直接写死了“Ubuntu”,因为我找不到从字体文件中获取这个名称的方法):

label = pyglet.text.Label(text="Hello", font_name="Ubuntu", font_size=16)

不过,Pyglet的字体系统似乎只会注册第一个使用这个名称Ubuntu的字体,并且在所有地方都使用这个字体,无论是斜体还是其他样式。

所以,如果我先加载Ubuntu-BI.ttf,那么所有使用Ubuntu的地方都是斜体。如果我先加载Ubuntu-B.ttf,那么所有地方都是非斜体的粗体,即使我在后面加载了斜体字体。

我找不到一个明显的方法来在运行时清除或移除已经加载的字体。有没有什么办法可以解决这个问题?

2 个回答

0

在meowsqueak的回答基础上,你可能想用 get_name('family') 代替 get_name('name')。更具体来说,在我的情况下,我只有一个 .ttf 文件,它只包含了加粗版本的字体。使用

    p = pyglet.font.ttf.TruetypeInfo(path)
    print p.get_name('name')
    print p.get_name('family')

产生了

Orbitron Bold
Orbitron

pyglet没有识别出这个字体,使用

pyglet.text.Label(text="Text", font_name='Orbitron Bold')

但是

pyglet.text.Label(text="Text", font_name='Orbitron', bold=True,

就可以正常工作了。

4

我找到了自己的解决办法。其实有一个没有文档说明的类,叫做 pyglet.font.ttf.TruetypeInfo,可以用来获取特定字体文件的正确 字体名称。这样我在使用不同字体的时候,就能用上正确的字体名称,而不是让 Pyglet 根据不完整的字体名称来选择最合适的选项。所以现在我可以直接使用我需要的字体了:

def load_font(path):
    # load external font from file
    p = TruetypeInfo(path)
    name = p.get_name("name")
    p.close()
    font.add_file(path)
    print("Loaded font " + name + " from " + path)

参考 pyglet-users 的讨论。

撰写回答