如何为PyInstaller打包的Python程序添加背景及图标图片资源?
PyInstaller打包Tkinter程序时资源文件加载失败的解决方法
问题根源
打包后exe运行时的工作路径和本地开发环境不同,直接用相对路径会找不到文件;另外你的打包命令里图标路径存在笔误(NA Chai.icon应该是DNAChain.ico),这也会导致图标加载失败。
解决方案一:修正路径逻辑+手动放置资源
修改代码,让程序自动适配本地开发和打包后的运行环境,获取正确的资源路径:
- 在代码中添加资源路径获取函数:
import sys import os from tkinter import Tk, Label, PhotoImage def resource_path(relative_path): try: # PyInstaller打包后会把资源放在临时目录sys._MEIPASS下 base_path = sys._MEIPASS except Exception: # 本地开发时使用当前脚本所在目录 base_path = os.path.abspath(".") return os.path.join(base_path, relative_path)
- 修改资源加载代码,用上面的函数获取路径:
window = Tk() # 加载背景图 bg = PhotoImage(file=resource_path("DNA.png")) label1 = Label(window, image=bg) label1.place(x=0, y=0) # 设置窗口图标 window.iconbitmap(resource_path("DNAChain.ico")) window.mainloop()
- 重新打包(注意修正图标路径):
D:\Python>pyinstaller --noconsole project.py --icon=D:\Python\DNAChain.ico
- 打包完成后,将
DNA.png和DNAChain.ico复制到dist\project文件夹中(和生成的exe同目录),再运行exe即可。
解决方案二:将资源打包进exe(无需手动复制文件)
如果不想每次都手动复制资源,可以通过PyInstaller的spec文件把资源打包进exe:
- 生成spec文件:
D:\Python>pyinstaller --noconsole project.py --icon=D:\Python\DNAChain.ico --name MyApp
执行后会生成MyApp.spec文件。
- 编辑
MyApp.spec,在datas列表中添加资源文件:
a = Analysis( ['project.py'], pathex=[], binaries=[], # 格式:(源文件路径, 打包后资源存放的相对路径),这里设置为当前目录 datas=[('D:\\Python\\DNA.png', '.'), ('D:\\Python\\DNAChain.ico', '.')], hiddenimports=[], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], noarchive=False, ) # 以下内容保持不变 pyz = PYZ(a.pure) exe = EXE( pyz, a.scripts, a.binaries, a.datas, [], name='MyApp', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=False, disable_windowed_traceback=False, argv_emulation=False, target_arch=None, codesign_identity=None, entitlements_file=None, icon='D:\\Python\\DNAChain.ico' )
- 用spec文件重新打包:
D:\Python>pyinstaller MyApp.spec
打包完成后,直接运行dist\MyApp\MyApp.exe即可,无需额外复制资源文件。
内容的提问来源于stack exchange,提问作者Mr. Iluminat
相关产品推荐
相关产品推荐

