使用PyInstaller打包CustomTkinter程序时图片无法显示的问题
解决PyInstaller单文件打包CustomTkinter后图片加载失败的问题
这个问题的核心原因是:PyInstaller单文件模式打包时,会把所有程序资源临时解压到系统的临时目录(比如Windows的%temp%\_MEIxxxxxx),而你代码里用的相对路径是基于源码所在目录的,运行exe时这个路径根本不存在,自然会报FileNotFoundError。
下面是具体的解决步骤:
1. 修改代码,动态获取资源路径
在你的代码里添加一个获取资源路径的辅助函数,用来适配打包前后的路径差异:
import sys import os def get_resource_path(relative_path): # 判断是否是PyInstaller打包后的环境 if hasattr(sys, '_MEIPASS'): return os.path.join(sys._MEIPASS, relative_path) # 非打包环境,返回源码目录下的路径 return os.path.join(os.path.dirname(os.path.abspath(__file__)), relative_path)
然后把原来引用图片的代码替换成用这个函数生成的路径,比如:
from PIL import Image import customtkinter as ctk # 替换原来的相对路径写法 light_img_path = get_resource_path("arquivos/logoLight.png") dark_img_path = get_resource_path("arquivos/logoDark.png") light_img = Image.open(light_img_path) dark_img = Image.open(dark_img_path) # 后续正常使用图片,比如设置组件图片或窗口图标 app = ctk.CTk() logo = ctk.CTkImage(light_image=light_img, dark_image=dark_img, size=(100,100)) ctk.CTkLabel(app, image=logo, text="").pack()
2. 修改PyInstaller打包命令,指定要打包的资源
你需要告诉PyInstaller把arquivos目录下的图片一起打包进去,在原来的命令基础上添加--add-data参数:
Windows系统
pyinstaller --onefile -w --add-data "arquivos/*.png;arquivos/" app.py
如果要打包整个arquivos目录(包含所有子文件/文件夹),可以用:
pyinstaller --onefile -w --add-data "arquivos;arquivos" app.py
Mac/Linux系统
路径分隔符用冒号:代替分号;:
pyinstaller --onefile -w --add-data "arquivos/*.png:arquivos/" app.py
验证打包结果
重新执行打包命令后,运行生成的exe文件,图片应该就能正常加载了。
内容的提问来源于stack exchange,提问作者Daniel Barreto Miranda
相关产品推荐
相关产品推荐

