Python中用pyinstaller打包时的图标问题及解决方法


Posted in Python onFebruary 17, 2020

前言

因为昨天重新研究了下python的打包方法,今天一番准备把之前写的一个pdf合并软件重新整理一下,打包出来。

但在打包的过程中仍然遇到了一些问题,半年前一番做打包的时候也遇到了一些问题,现在来看,解决这些问题思路清晰多了,这里记录下。

问题

打包成功,但运行时提示Failed to execute script xxx。这里又分很多种原因,这时不要用-w打包,然后在终端.\xxx.exe的方式运行,就可以看到输出日志了。

原因一

D:\02-python\2019-09-30_pdf_opt\dist>.\pdfmerge.exe
Traceback (most recent call last):
  File "pdfmerge.py", line 5, in <module>
ModuleNotFoundError: No module named 'PyPDF2'
[47572] Failed to execute script pdfmerge

这个是因为我们打包的时候用的是系统的pyinstaller命令,而系统的python库里没有安装相应的依赖包,这时要么用退出当前的虚拟环境,要么在进入虚拟环境并给虚拟环境在Scripts下面安装pyinstaller命令。

原因二

D:\02-python\2019-09-30_pdf_opt\dist>.\pdfmerge.exe
Traceback (most recent call last):
  File "pdfmerge.py", line 97, in <module>
  File "tkinter\__init__.py", line 1871, in wm_iconbitmap
_tkinter.TclError: bitmap ".\assert\efon.ico" not defined
[95216] Failed to execute script pdfmerge

这个是因为我们在py代码里指定了程序图标,但pyinstaller不能将依赖文件打包到一个exe里,所以需要我们把图标文件拷贝到当前exe目录下。当然,然后另外的解决办法,就是下面我们要讲的把图标打包到代码里的方法。

把图标打包到代码里首先,编写一个py程序,来自动生成一个包含图标内容的类

import base64
with open("icon.py","w") as f:
  f.write('class Icon(object):\n')
  f.write('\tdef __init__(self):\n')
  f.write("\t\tself.img='")
with open("icon.ico","rb") as i:
  b64str = base64.b64encode(i.read())
  with open("icon.py","ab+") as f:
    f.write(b64str)
with open("icon.py","a") as f:
  f.write("'")

然后执行它,结果是这样的:

Python中用pyinstaller打包时的图标问题及解决方法

然后我们在我们要打包的py程序里去指定这个图标:

with open('tmp.ico','wb') as tmp:
    tmp.write(base64.b64decode(Icon().img))
  window.iconbitmap('tmp.ico')
  os.remove('tmp.ico')

原理就是先把Icon类的里ico数据读出来,转换为二进制再写到当前目录生成一个临时ico,然后指定程序图标,最后删除这个临时图标。

这样就能保证我们的程序一定能在当前目录加载图标。一气呵成,速度非常快,并不会看到有生成临时文件。

如果程序里还有其他外部依赖文件,可以按照同样的道理处理。

这样我们的打包过程就完成啦,最终就只有一个exe文件,然后就可以发布了!

总结

以上所述是小编给大家介绍的Python中用pyinstaller打包时的图标问题及解决方法,希望对大家有所帮助!

Python 相关文章推荐
八大排序算法的Python实现
Jan 28 Python
Python的Flask框架中配置多个子域名的方法讲解
Jun 07 Python
python with提前退出遇到的坑与解决方案
Jan 05 Python
Python深度优先算法生成迷宫
Jan 22 Python
Python File(文件) 方法整理
Feb 18 Python
python GUI实现小球满屏乱跑效果
May 09 Python
python ftplib模块使用代码实例
Dec 31 Python
Python基础之函数基本用法与进阶详解
Jan 02 Python
Python flask框架实现查询数据库并显示数据
Jun 04 Python
Python实现淘宝秒杀功能的示例代码
Jan 19 Python
pycharm代码删除恢复的方法
Jun 26 Python
Python3中最常用的5种线程锁实例总结
Jul 07 Python
Python交互环境下打印和输入函数的实例内容
Feb 16 #Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
Feb 16 #Python
基于python实现微信好友数据分析(简单)
Feb 16 #Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
Feb 16 #Python
python中的 zip函数详解及用法举例
Feb 16 #Python
Python中zip()函数的解释和可视化(实例详解)
Feb 16 #Python
解决tensorboard多个events文件显示紊乱的问题
Feb 15 #Python
You might like
基于mysql的bbs设计(一)
2006/10/09 PHP
php下MYSQL limit的优化
2008/01/10 PHP
windows下zendframework项目环境搭建(通过命令行配置)
2012/12/06 PHP
PHP无限分类(树形类)的深入分析
2013/06/02 PHP
数组与类使用PHP的可变变量名需要的注意的问题
2013/06/20 PHP
Redis构建分布式锁
2017/03/28 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
2019/10/17 PHP
ASP 过滤数组重复数据函数(加强版)
2010/05/31 Javascript
Javascript 静态页面实现随机显示广告的办法
2010/11/17 Javascript
实用的JS正则表达式(手机号码/IP正则/邮编正则/电话等)
2013/01/11 Javascript
一个简单的全屏图片上下打开显示网页效果示例
2014/07/08 Javascript
js实现跟随鼠标移动且带关闭功能的图片广告实例
2015/02/26 Javascript
JavaScript实现节点的删除与序号重建实例
2015/08/05 Javascript
JavaScript函数的调用以及参数传递
2015/10/21 Javascript
javascript先序遍历DOM树的方法
2016/02/27 Javascript
在javascript中创建对象的各种模式解析
2016/05/16 Javascript
seajs实现强制刷新本地缓存的方法分析
2017/10/16 Javascript
webpack+vue中使用别名路径引用静态图片地址
2017/11/20 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
浅析Vue中拆分视图层代码的5点建议
2019/08/15 Javascript
微信小程序实现点击图片放大预览
2019/10/21 Javascript
微信小程序实现手指拖动选项排序
2020/04/22 Javascript
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
2014/05/23 Python
跟老齐学Python之不要红头文件(1)
2014/09/28 Python
python中文分词,使用结巴分词对python进行分词(实例讲解)
2017/11/14 Python
python3爬取淘宝信息代码分析
2018/02/10 Python
Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例
2018/05/04 Python
Python实现快速傅里叶变换的方法(FFT)
2018/07/21 Python
Python3实现的反转单链表算法示例
2019/03/08 Python
简单了解python元组tuple相关原理
2019/12/02 Python
Softmax函数原理及Python实现过程解析
2020/05/22 Python
自动化系在校本科生求职信
2013/10/23 职场文书
出租房屋协议书
2014/09/14 职场文书
工商局所长四风自我剖析及整改措施
2014/10/26 职场文书
见习报告的格式
2014/11/04 职场文书
Python NumPy灰度图像的压缩原理讲解
2021/08/04 Python