You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将图片嵌入PyInstaller打包的Python(Tkinter)独立可执行文件及exe体积过大原因咨询

如何嵌入图片到PyInstaller打包的exe中,以及解决exe体积过大的问题

一、嵌入image.png到应用程序中

有两种实用方法可以实现图片嵌入,不用再依赖外部文件:

方法1:将图片转成Base64字符串直接嵌入代码

这种方法把图片数据编码成字符串写入代码,完全不需要额外携带图片文件:

  1. 先运行一个小脚本把图片转成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}'")
  1. 在你的主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会自动把图片解压到临时目录,你只需要在代码中正确获取这个路径:

  1. 修改你的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()
  1. 带--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可能会误打包进去。

缩小体积的方法

  1. 使用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
  1. 排除不必要的模块:
    如果脚本没用到某些库,用--exclude-module排除它们,比如:
pyinstaller --onefile --exclude-module numpy --exclude-module pandas your_script.py
  1. 用干净的虚拟环境打包:
    用venv或Miniconda创建一个只装必要依赖(比如tkinter、pillow)的虚拟环境,在这个环境里打包,避免打包多余的库。
  2. 改用--onedir模式:
    放弃单个exe,生成一个文件夹,里面包含exe和所有依赖文件,单个exe体积会小很多,只是分发时需要整个文件夹:
pyinstaller --onedir --add-data "image.png;." your_script.py
  1. 清理不必要的导入:
    检查脚本,删掉那些导入了但实际没用到的库,减少PyInstaller需要打包的内容。

内容的提问来源于stack exchange,提问作者Aleksandr Tyshkevich

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 10:24:10