如何在Pyglet中加载同一字体家族的变体?
我想在Pyglet中显示多个文本标签,使用不同的字体。在这个例子中,我使用的是“Ubuntu”字体,有时候是粗体,有时候是斜体。我手里有两个字体文件,分别是 Ubuntu-B.ttf
和 Ubuntu-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 的讨论。