Python - 查找TTF文件

3

有人能够改进这个吗?我对Python比较新,正在尝试编写可移植的代码。我需要定位一个字体文件,以便传递给ImageDraw.Draw.Text。

import matplotlib.font_manager as fontman

def findFontFile(searchFont):
    fList = fontman.findSystemFonts(fontpaths=None, fontext='ttf')
    targetFont = []
    for row in fList:
        try:
            if searchFont in row:
                targetFont.append(row)
        except TypeError:
            pass
    return targetFont[0]

在我的系统中,这给了我:
>>> findFontFile('DejaVuSans.ttf')
'/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf'

这正是我需要的。这个方案是否适用于Mac/Windows系统,以及Linux(已在Linux上测试)?是否可以更高效地完成?是否可以采用更易读的风格?Mac/Windows是否有不同的字体文件命名格式?欢迎提出建议。


阅读文档后,它说支持多个平台。我认为你可以花一些时间找出它应该在哪些平台上工作。你的代码似乎没有任何与平台相关的部分,所以它完全取决于matplotlib。此外,如果任何字体都适合你,你可以return row - ferrix
你为什么没有使用matplotlib.font_manager.FontManager? - Lie Ryan
因为我没有阅读完整的文档,所以我标记了Cristiano的答案,但我可能会选择FontManager。谢谢。 - Dorsey
2个回答

1
我会进行一些小的重写,例如(某些更改只是风格问题,更像Python):
   def find_font_file(query):
       matches = list(filter(lambda path: query in os.path.basename(path), fontman.findSystemFonts()))
       return matches

调用者将决定使用哪个元素(在检查权限等之后)。
至于兼容性,您可以在此处查看,该库使用一组常见目录来搜索“主要”操作系统的字体(X窗口管理器(Linux),Windows和OS X)。但是,如果您对应用程序将运行的不同环境具有更多信息,则始终可以传递要搜索的目录。

根据@lieryan的建议进行了更改 - cristiano2lopes
在Python3中,filter不起作用。但是对fontman的引用非常好。 - Josir

0

在执行 if searchFont in row 时要小心。

如果某人的用户名是 marial,而你正在搜索字体 arial,通过使用 findFontFile('arial'),你的代码将获取用户主目录中安装的所有字体(即 /home/marial/.fonts)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接