如何将图片嵌入PyInstaller打包的Python(Tkinter)独立可执行文件及exe体积过大原因咨询
如何嵌入图片到PyInstaller打包的exe中,以及解决exe体积过大的问题
一、嵌入image.png到应用程序中
有两种实用方法可以实现图片嵌入,不用再依赖外部文件:
方法1:将图片转成Base64字符串直接嵌入代码
这种方法把图片数据编码成字符串写入代码,完全不需要额外携带图片文件:
- 先运行一个小脚本把图片转成Base64格式:
import base64 with open("image.png", "rb") as img_file: b64_str = base64.b64encode(img_file.read()).decode() with open("image_data.py", "w") as out_file: out_file.write(f"IMAGE_B64 = '{b64_str}'")
- 在你的主Tkinter脚本里引用这个Base64字符串:
import tkinter as tk from PIL import Image, ImageTk # 用PIL支持更多图片格式,若只需要PNG/GIF可改用Tkinter原生PhotoImage from io import BytesIO from image_data import IMAGE_B64 root = tk.Tk() # 解码Base64数据并转为Tkinter可用的图片对象 img_bytes = base64.b64decode(IMAGE_B64) img = Image.open(BytesIO(img_bytes)) tk_img = ImageTk.PhotoImage(img) # 若用Tkinter原生PhotoImage,可直接写: # from tkinter import PhotoImage # tk_img = PhotoImage(data=IMAGE_B64) label = tk.Label(root, image=tk_img) label.pack() root.mainloop()
打包时直接运行PyInstaller即可,不需要额外参数,因为图片数据已经内嵌在代码里了。
方法2:用PyInstaller的--add-data打包图片并动态获取路径
这种方法把图片和exe打包在一起,运行时PyInstaller会自动把图片解压到临时目录,你只需要在代码中正确获取这个路径:
- 修改你的Tkinter脚本,添加路径获取函数:
import tkinter as tk import sys import os def get_resource_path(relative_path): try: # 打包后运行时的临时目录路径(PyInstaller自动生成) base_path = sys._MEIPASS except Exception: # 本地开发时的当前工作目录 base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) root = tk.Tk() # 获取打包后的图片路径 img_path = get_resource_path("image.png") tk_img = tk.PhotoImage(file=img_path) label = tk.Label(root, image=tk_img) label.pack() root.mainloop()
- 带
--add-data参数打包:
Windows系统用分号分隔路径:
pyinstaller --onefile --add-data "image.png;." your_script.py
Linux/macOS系统用冒号分隔:
pyinstaller --onefile --add-data "image.png:." your_script.py
打包后的exe会包含image.png,运行时自动处理路径,不需要额外携带图片文件。
二、为什么exe体积高达350MB?如何缩小?
PyInstaller打包的exe体积大是很常见的情况,主要原因和优化方法如下:
主要原因
- 包含完整Python环境:PyInstaller会把整个Python解释器、Tkinter的所有组件(包括相关GUI库文件)都打包进去,这些本身就占了不少体积。
--onefile参数的影响:用--onefile打包成单个exe时,所有依赖都会被压缩到一个文件里,解压后的总内容会比文件夹模式更“臃肿”。- 多余依赖被打包:如果你的Python环境里装了很多没用的库(比如之前开发其他项目的遗留依赖),PyInstaller可能会误打包进去。
缩小体积的方法
- 使用UPX压缩:
UPX是开源的可执行文件压缩工具,能大幅减少exe体积。先安装UPX,然后打包时添加参数:
pyinstaller --onefile --upx your_script.py
如果UPX不在系统PATH里,用--upx-dir指定路径:
pyinstaller --onefile --upx-dir "C:\path\to\upx" your_script.py
- 排除不必要的模块:
如果脚本没用到某些库,用--exclude-module排除它们,比如:
pyinstaller --onefile --exclude-module numpy --exclude-module pandas your_script.py
- 用干净的虚拟环境打包:
用venv或Miniconda创建一个只装必要依赖(比如tkinter、pillow)的虚拟环境,在这个环境里打包,避免打包多余的库。 - 改用
--onedir模式:
放弃单个exe,生成一个文件夹,里面包含exe和所有依赖文件,单个exe体积会小很多,只是分发时需要整个文件夹:
pyinstaller --onedir --add-data "image.png;." your_script.py
- 清理不必要的导入:
检查脚本,删掉那些导入了但实际没用到的库,减少PyInstaller需要打包的内容。
内容的提问来源于stack exchange,提问作者Aleksandr Tyshkevich
相关产品推荐
相关产品推荐

