移至主內容
DarkRanger's Secret Area

主導覽

  • 首頁
  • 關於本站
  • Linux
  • 程式開發
  • N900
  • 譯文
  • 資訊技術辭典

文章分類

  • 影劇
  • 遊戲
  • 筆記
  • 雜文
  • 資訊技術
  • 站務訊息

最新內容

  • I use zip bombs to protect my server
  • Iconography of the PuTTY tools
  • Fedora 42 安裝 OpenSSL 1.1
  • 關於本站改版的其它替代方案
  • 半途而廢的未破台單機遊戲列表
  • The Big Picture (1997)
  • How-To:Linux 安裝 DevilutionX
  • 於 2012 年建立的一份音樂播放清單
  • How-To:Linux 安裝 Medal of Honor: Allied Assault
  • Fallout 4 (2015)

01/27/2013 筆記

發表日期:星期日, 01/27/2013 - 16:44,更新日期:星期日, 01/27/2013 - 18:56

把自己寫的舊東西再拿出來修改有時候是件很痛苦的事……話說 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 時特別將字型檔包入就解決了。

 

筆記