PyInstaller--onefile打包后,如何正确指定PIL加载的图标文件路径?
解决PyInstaller --onefile模式下pystray图标找不到的问题
问题根源
--onefile模式下,PyInstaller会把所有资源打包进单个exe,运行时自动解压到系统临时目录,而os.getcwd()获取的是你启动exe的当前工作目录,不是临时解压目录,所以找不到图标文件。
解决步骤
1. 修改代码获取正确路径
替换原来的路径获取方式,用PyInstaller提供的sys._MEIPASS变量获取临时解压目录:
import pystray from PIL import Image import os import sys # 定义资源路径获取函数 def resource_path(relative_path): try: # 打包后运行时,指向临时解压目录 base_path = sys._MEIPASS except Exception: # 未打包时,指向当前工作目录 base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) # 用resource_path获取图标路径 menuImg = Image.open(resource_path('icon.png')) MenuIcon = pystray.Icon('Neural', menuImg, menu=pystray.Menu( pystray.MenuItem('Exit', HandleTrayClick), )) MenuIcon.run()
2. 配置auto-py-to-exe打包参数
打开auto-py-to-exe:
- 在Additional Files区域,点击
Add Files选择你的icon.png - 确保该文件的
Destination留空(或设为.),这样打包时会把图标文件纳入资源,运行时解压到临时目录
3. 重新打包
按正常流程选择--onefile模式,完成打包后运行exe即可正常加载图标。
内容的提问来源于stack exchange,提问作者Collaxd
相关产品推荐
相关产品推荐

