一種使用pyinstaller時圖標問題解決方案


0x00 場景

  使用pyinstaller將.py文件編譯成.exe文件時,想要使用自己心儀的圖標(.ico)比較麻煩。在使用pyinstaller時,用參數:--icon可以給生成的可執行文件設定自定義圖標,但這只是給程序一個圖標,而在程序開啟后,窗口右上角的圖標卻依舊是默認的tk圖標(羽毛)。

  如果想要在腳本中直接函數iconbitmap('圖標路徑')來設定窗口左上角圖標,雖然使用python編譯器可以正確呈現自定義的圖標,但是用pyinstaller編譯成.exe文件之后,程序窗口可能組件呈現不出來或者干脆程序無法執行。

  下面給出一種解決方案,可以有效又方便的解決程序內圖標無效的問題。

0x01 解決方案

Step 1 將圖標文件寫在類中###

准備:一個圖標文件pen.ico

  圖標文件同目錄下首先創建一個py文件,源碼如下:

import base64
with open("icon.py","a") as f:
    f.write('class Icon(object):\n')
    f.write('\tdef __init__(self):\n')
    f.write("\t\tself.img='")
with open("pen.ico","rb") as i:
    b64str = base64.b64encode(i.read())
    with open("icon.py","ab+") as f:
        f.write(b64str)
with open("icon.py","a") as f:
    f.write("'")

  此時,在同文件夾下產生一個icon.py的模塊。把它保存在類當中是為了讓我們要編譯的py能夠創建並調用之。

Step 2 從在類中讀出圖標文件

  在我們要編譯成可執行文件的腳本中,用

from icon import Icon
with open('tmp.ico','wb') as tmp:
    tmp.write(base64.b64decode(Icon().img))
root.iconbitmap('tmp.ico')
os.remove('tmp.ico')

代替腳本中類似下面這樣的語句

root.iconbitmap('pen.ico')

0x03 總結

  經過如上兩步,就能在使用pyinstaller編譯后正確的呈現自定義圖標而且程序能夠正常工作了。這種將文件在開發階段編碼后編譯在可執行文件,到了程序運行的時候自動生成的方法也能夠用到產生程序其他必要的文件中。

0x04 參考文獻##

  1. lion_cui. Pyinstaller 打包 Tkinter 程序時引入圖標解決方法[EB/OL]. http://blog.csdn.net/lion_cui/article/details/51329497.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM