2013-03-12 91 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) 。