2個步驟可以做到這個功能,但似乎有其他簡單一點的做法,PyInstaller 應該可以打包外部資源檔案進去。
檔案內容轉成String
icon_to_py.py:
import base64 icon = open('test.ico','rb') b64str = base64.b64encode(icon.read()) icon.close() data = "iconImg = '%s'" %b64str f = open('icon.py', 'w+') f.write(data) f.close()
tkinter GUI 主程式
gui.py
import tkinter as tk import base64, os root = tk.Tk() iconImg = 'Base64Data' tmpIcon = open('tmp.ico', 'wb+') tmpIcon.write(base64.b64decode(iconImg)) tmpIcon.close() root.iconbitmap('tmp.ico') os.remove('tmp.ico') root.mainloop()
上面的寫法,無法套用到 macOS 和 Linux, Linux 解法:
tmpIcon = open(icon_filepath, 'wb+')
tmpIcon.write(base64.b64decode(iconImg))
tmpIcon.close()
if platform.system() == 'Windows':
root.iconbitmap(icon_filepath)
if platform.system() == 'Darwin':
from PIL import Image, ImageTk
logo = ImageTk.PhotoImage(Image.open(icon_filepath).convert('RGB'))
root.call('wm', 'iconphoto', root._w, logo)
if platform.system() == 'Linux':
logo = PhotoImage(file=icon_filepath)
root.call('wm', 'iconphoto', root._w, logo)
os.remove(icon_filepath)
附註:Linux 的 icon 直接使用的是圖片PNG 格式即可,不需使用 icon format.
PyInstaller 打包說明:
https://pyinstaller.readthedocs.io/en/stable/usage.html