使用PyInstaller打包CustomTkinter程序后运行exe报错求助
问题:CustomTkinter + PyInstaller打包后exe无法加载.ico图标
我用CustomTkinter开发项目,PyInstaller打包成exe后运行报错,错误信息如下:
Traceback (most recent call last): File "main.py", line 3, in <module> File "<frozen importlib._bootstrap>", line 1176, in _find_and_load File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 690, in _load_unlocked File "PyInstaller\loader\pyimod02_importers.py", line 391, in exec_module File "src\app\frontend\main_ui.py", line 250, in <module> File "src\app\frontend\main_ui.py", line 215, in __init__ File "customtkinter\windows\ctk_tk.py", line 228, in wm_iconbitmap File "tkinter\__init__.py", line 2138, in wm_iconbitmap _tkinter.TclError: bitmap "data\images\valeo.ico" not defined
我试过Stack Overflow上的几种方法都没用,这个问题常见于Linux,但我用的是Windows 11,求解决办法。
解决方案
1. 修正图标路径的获取逻辑
PyInstaller打包后,程序会在临时目录_MEIPASS中运行,直接用开发时的相对路径找不到文件。必须通过sys._MEIPASS动态获取资源路径:
import sys import os def get_resource_path(relative_path): if hasattr(sys, '_MEIPASS'): return os.path.join(sys._MEIPASS, relative_path) return os.path.join(os.path.abspath("."), relative_path) # 替换原来的图标加载代码 icon_path = get_resource_path("data/images/valeo.ico") root.wm_iconbitmap(icon_path)
2. 强制PyInstaller打包图标文件
打包时必须明确告诉PyInstaller要包含这个.ico文件,有两种方式:
- 命令行直接打包:Windows系统用分号分隔源路径和目标路径
pyinstaller --add-data "data/images/valeo.ico;data/images/" main.py - 使用.spec文件:如果已经生成.spec文件,修改
datas字段:
然后执行datas=[('data/images/valeo.ico', 'data/images')],pyinstaller main.spec重新打包。
3. 验证图标文件本身是否正常
先在开发环境用绝对路径加载图标,确认文件没有损坏:
icon_path = "C:/你的项目根目录/data/images/valeo.ico" root.wm_iconbitmap(icon_path)
如果能正常显示,说明问题出在打包时的路径处理,回到前两个方案即可。
4. 重新生成兼容的.ico文件
部分.ico文件可能因为尺寸、格式不兼容导致tkinter无法识别。可以用图标生成工具制作标准Windows图标(推荐256×256像素),替换原文件后再打包测试。
内容的提问来源于stack exchange,提问作者Ahill Savio
相关产品推荐
相关产品推荐

