使用PyInstaller打包Tkinter应用后双击.exe报错:找不到图片文件
解决PyInstaller打包Tkinter应用后图片找不到的问题
问题根源
用pyinstaller --onefile打包时,程序运行会把资源临时解压到系统临时目录(比如C:\Users\<用户名>\AppData\Local\Temp\_MEIXXXXXX),双击exe时的当前工作目录不是exe所在文件夹,直接用相对路径找图片肯定找不到;而VSCode终端运行时,当前工作目录是项目根目录,所以能正常加载图片。
解决方案1:将图片打包进exe(推荐)
通过sys._MEIPASS获取PyInstaller临时解压目录,修改图片路径处理逻辑:
步骤1:修改代码中的图片路径
在intro.py开头添加路径处理代码:
import os import sys def get_resource_path(filename): # 判断是否是PyInstaller打包后的环境 if hasattr(sys, '_MEIPASS'): return os.path.join(sys._MEIPASS, filename) # 开发环境下,返回当前文件所在目录的同级路径 return os.path.join(os.path.dirname(os.path.abspath(__file__)), filename)
然后修改create_widgets里的图片打开代码:
# Titulo title_image_path = get_resource_path("FuelTrackRootTitle.png") title_image = Image.open(title_image_path) title_image_tk = ImageTk.PhotoImage(title_image) titulito = ttk.Label(self, image=title_image_tk, background='white') titulito.image = title_image_tk titulito.place(relx=0.5, rely=0.7, anchor='center') # Logo icon_image_path = get_resource_path("FuelTrackIconImage.png") icon_image = Image.open(icon_image_path).resize((300,300)) icon_image_tk = ImageTk.PhotoImage(icon_image) logo = ttk.Label(self, image=icon_image_tk, background='white') logo.image = icon_image_tk logo.place(relx=0.5, rely=0.36, anchor='center')
步骤2:重新打包时指定图片资源
用PyInstaller的--add-data参数把图片打包进去,命令改成:
pyinstaller --onefile --add-data "FuelTrackRootTitle.png;." --add-data "FuelTrackIconImage.png;." main.py
(Windows系统用;分隔路径,Linux/macOS用:)
解决方案2:让图片和exe放在同一目录
如果不想把图片打包进exe,想让用户和exe一起下载,就获取exe所在的真实目录,而不是当前工作目录:
修改路径处理函数:
import os import sys def get_resource_path(filename): # 获取exe所在目录 exe_dir = os.path.dirname(os.path.abspath(sys.executable)) return os.path.join(exe_dir, filename)
然后同样替换Image.open的路径,打包时不需要--add-data参数,打包后把图片复制到dist文件夹和exe放在一起即可。
验证方法
打包后,把exe移动到任意文件夹(方案1无需带图片,方案2要把图片和exe放一起),双击运行测试,应该不会再报找不到文件的错误。
内容的提问来源于stack exchange,提问作者Kama Vector
相关产品推荐
相关产品推荐

