PyInstaller打包tkinter生成的exe弹DLL错误、tkinter崩溃如何解决
问题描述
我使用tkinter和json库开发了一款简易应用,多个类拆分在独立的.py文件中呈树形关联,项目整体复杂度较高。脚本本身可以完美运行,但使用pyinstaller将其打包为.exe文件后触发报错。
报错相关信息
- 运行时错误弹窗:

- 报错指向第8行代码:

- 项目包含资源:2张图片(分别作为背景、边框素材)、1个标签控件、1个文本框控件。手动将图片文件夹放入dist目录后问题仍未解决。
- 原打包命令:
venv\Scripts\pyinstaller.exe Editor.py --distpath ./Ready_For_Testing --workpath ./temp_build --specpath ./spec_build -w --hidden-import tkinter
问题原因
报错本质是PyInstaller打包后的运行路径和本地开发时的脚本路径不一致,且打包过程没有将图片资源纳入打包范围,导致程序运行时找不到指定的图片文件。手动复制图片到dist目录不生效,是因为单文件模式下PyInstaller会把程序解压到系统临时目录运行,不会读取dist目录下的零散资源。
解决方法
1. 新增路径适配函数,兼容开发/打包两种运行环境
在项目入口文件Editor.py的最顶部加入以下代码,用来自动识别运行环境,返回资源的正确绝对路径:
import sys import os def get_resource_path(relative_path): try: # 打包后运行时,资源会被解压到sys._MEIPASS对应的临时目录 base_path = sys._MEIPASS except AttributeError: # 本地开发环境下,取脚本所在目录作为基准路径 base_path = os.path.dirname(os.path.abspath(__file__)) return os.path.join(base_path, relative_path)
之后所有加载图片的代码,都要把原来的相对路径套上这个函数,举个例子:
# 原来的写法 bg_img = tk.PhotoImage(file="img/bg.png") # 修改后的写法 bg_img = tk.PhotoImage(file=get_resource_path("img/bg.png"))
2. 修改打包命令,显式指定要打包的资源文件
之前的打包命令没有声明需要打包的图片资源,PyInstaller默认只会打包依赖的Python库,不会把静态资源打进去。根据你的图片存放位置调整命令:
- 如果两张图片直接放在项目根目录,命令如下(把文件名换成你实际的图片名):
venv\Scripts\pyinstaller.exe Editor.py --distpath ./Ready_For_Testing --workpath ./temp_build --specpath ./spec_build -w --hidden-import tkinter --add-data "bg.png;." --add-data "border.png;."
- 如果图片统一存放在
assets/images这类文件夹下,直接把整个文件夹打包进去即可:
venv\Scripts\pyinstaller.exe Editor.py --distpath ./Ready_For_Testing --workpath ./temp_build --specpath ./spec_build -w --hidden-import tkinter --add-data "images;images"
注意:Windows环境下
--add-data参数的源路径和目标解压路径用分号;分隔,不要写成冒号。
打包完成后直接运行dist目录下的exe即可,不需要额外手动复制图片资源。如果后续还有拆分的模块找不到的问题,可以直接编辑生成的.spec文件,在hiddenimports列表里补上所有自定义模块的名称,再执行venv\Scripts\pyinstaller.exe ./spec_build/Editor.spec重新打包即可。
内容的提问来源于stack exchange,提问作者JohnyCapo
相关产品推荐
相关产品推荐

