PyInstaller打包Tkinter程序为exe后图标路径报错如何解决
问题原因
使用--onefile模式打包的PyInstaller程序,启动时会自动把所有捆绑的资源解压到AppData\Local\Temp下随机命名的_MEI开头的临时文件夹中,程序运行结束后会自动清理这些临时文件。
你遇到报错有两个核心原因:
- 原有路径逻辑直接取
__file__的所在目录,打包后__file__实际指向的是上述临时解压目录,不是exe存放的真实目录 - 当前使用的打包命令没有把
Icon.ico作为附加资源捆绑进exe,临时目录里根本不存在这个图标文件,自然会提示找不到。
修复步骤
- 第一步:替换原有路径获取代码,兼容本地脚本运行、打包后运行两种场景
PyInstaller打包运行的程序会自带sys._MEIPASS属性,值就是临时资源目录的路径,我们可以通过判断这个属性是否存在,来选择正确的基础路径拼接资源地址,替换后的代码如下:
import os import sys def resource_path(relative_path): if hasattr(sys, '_MEIPASS'): base_dir = sys._MEIPASS else: base_dir = os.path.dirname(os.path.abspath(__file__)) return os.path.join(base_dir, relative_path) # 加载图标 root.iconbitmap(resource_path("Icon.ico"))
- 第二步:调整打包命令,将图标文件作为附加资源打包进exe
Windows环境下--add-data参数的格式为本地资源路径;打包后解压路径,因为代码里是直接读取根目录下的图标文件,所以解压路径填.(代表临时目录根路径)即可,调整后的打包命令:
pyinstaller "你的脚本文件名.py" --onefile --add-data "Icon.ico;."
注意:如果
Icon.ico没有和脚本放在同一目录,需要把命令里的Icon.ico替换成图标文件的实际相对/绝对路径。
内容的提问来源于stack exchange,提问作者LostSilverCoin
相关产品推荐
相关产品推荐

