设置了icon图标的程序,打包后无法运行
原始程序是一个GUI程序,使用iconbitmap('tmp.ico')
设置了icon图标,本地运行正常,但打包后无法运行(报错)。
解决方法是在程序执行时自动生成一个icon,然后用这个临时的icon文件作为GUI的图标。
temp_icon = os.path.join(tempfile.gettempdir(), 'tmp.ico')
with open(temp_icon, 'wb+') as tmp:
tmp.write(base64.b64decode(Icon.img))
root.iconbitmap(temp_icon)
这里的Icon.img
是一个类变量,类型是base64编码的字符串。也就是说要先将ico图标转换成base64编码的字符串,保存到这个类变量中。具体参考:Pyinstaller 打包 Tkinter 程序时引入图标解决方法
打包其他文件/文件夹到生成的程序中
由于程序引用了其他目录下的文件,pyinstaller无法自动的识别并打包他们,所以需要手动指定这些文件、文件夹,方法是修改打包时生成的spec
文件,首先,先使用如下命令打包,会自动生成一个spec
文件:
pyinstaller -F -w -i ico.ico run.py
-F 表示生成一个文件
-w 表示不显示命令行窗体(用在GUI程序上)
-i 指定icon 最后是入口py文件
然后,修改生成的spec文件的datas
字段:
# -*- mode: python -*-
block_cipher = None
a = Analysis(['run.py'],
pathex=['D:\\PyCharm Projects\\xxx'],
binaries=[],
datas=[('D:\\PyCharm Projects\\xxx\\ss', 'ss')],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='run',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=False , icon='icon/ico.ico')
其中,datas=[('D:\\PyCharm Projects\\xxx\\ss', 'ss'),......],
表示将’D:\PyCharm Projects\xxx\ss’目录打包,'ss’作为其在打包后的程序中的路径,即:(原项目中资源文件路径,打包后路径)
完成后,使用如下命令再次打包:
pyinstaller run.spec