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 会有不同的字体文件命名格式吗?欢迎提出建议。

4

2 回答 2

1

我会做一些重写(一些变化只是风格问题,更像是python):

   def find_font_file(query):
       matches = list(filter(lambda path: query in os.path.basename(path), fontman.findSystemFonts()))
       return matches

然后调用者将决定要使用的元素(在检查权限等之后)。

至于兼容性,您可以在此处查看lib 使用一组“主要”操作系统的常用目录来搜索字体(X 窗口管理器(linux)、windows 和 os x)。但是,如果您有更多关于应用程序将运行的不同环境的信息,您始终可以传递要搜索的目录。

于 2013-03-12T18:39:05.470 回答
0

做的时候要小心if searchFont in row

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

于 2013-03-13T05:33:50.610 回答