2013-03-12 79 views
3

任何人都可以改进?我相当新的python,并试图编写可移植的代码。我需要找到一个字体文件传递给ImageDraw.Draw.Text。Python - 查找TTF文件

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

+0

阅读[文档](http://matplotlib.org/api/font_manager_api.html)它说它支持多个平台。我想你可能会花一段时间试图找出它应该工作的平台。 您的任何代码似乎都不依赖于平台,因此全部取决于matplotlib。 此外,如果任何字体对你有好处,你可以'返回行'。 – ferrix 2013-03-12 17:12:58

+0

你为什么不使用matplotlib.font_manager.FontManager? – 2013-03-13 05:44:34

+0

因为我没有阅读完整的文档。我已经标记了Cristiano的答案,但我可能会使用FontManager。感谢那。 – Dorsey 2013-03-13 14:58:45

回答

0

我会做一点点改写像(一些变化只是一个风格问题,更蟒蛇等):

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

主叫方将随后决定使用(检查权限等后)的元素。

至于兼容性,您可以查看here该lib为“主要”操作系统搜索字体(X窗口管理器(linux),Windows和操作系统x)使用一组通用目录。但是,如果您有更多有关应用程序运行环境的更多信息,则可以随时传递要搜索的目录。

+0

更改为关注@lieryan建议 – cristiano2lopes 2013-03-13 09:32:11

0

做的时候要小心if searchFont in row

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