01/27/2013 筆記

把自己寫的舊東西再拿出來修改有時候是件很痛苦的事……話說 DR 近日受朋友所託,要將自己在大約兩年前寫的一支 pygame 程式做一些加強。由於當初的程式內容算是急就章寫出來的,所以在增加功能之前,DR 決定先大幅清理程式碼,包含終於用 Class 把該做的物件做好等等……

 

另一方面,DR 這次也決定使用 PyInstaller 來方便產出用於 Windows 平台的獨立執行檔,不過產出的執行檔卻無法順利執行,也沒有任何錯誤訊息可供排錯。後來經過網路上的搜尋以及一段一段的程式碼測試後,發現問題就出在這一行:

font = pygame.font.Font(None, 17)

 

根據 pygame 文件的說明,當字型檔為 None 時,就會直接取用預設字型。雖然這個寫法在一般執行時是沒有問題的,但使用 PyInstaller 產出獨立執行檔後就會出錯。而解法其實很簡單,就抓一個字型檔給它吧:

font = pygame.font.Font(internalResource("fonts/DejaVuSans-Bold.ttf"), 17)

 

上述程式碼中,DR 所自訂的 internalResource() 函式也是針對 PyInstaller 所寫的,為的是當字型檔被包進執行檔後,也能夠正確的被程式讀取,該函式的內容如下:

def internalResource(path):
    if hasattr(sys, "_MEIPASS"):
        return os.path.abspath(os.path.join(sys._MEIPASS, path))
    else:
        return os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), path))

 

最後在執行 PyInstaller 時特別將字型檔包入就解決了。

 

分類: