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嵌套字典比较值与取值的实现示例
Nov 03 Python
Python实现的多项式拟合功能示例【基于matplotlib】
May 15 Python
python实现超市扫码仪计费
May 30 Python
由面试题加深对Django的认识理解
Jul 19 Python
Python re正则表达式元字符分组()用法分享
Feb 10 Python
Mysql数据库反向生成Django里面的models指令方式
May 18 Python
什么是python的自省
Jun 21 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
Aug 28 Python
python 实现批量图片识别并翻译
Nov 02 Python
Python Http请求json解析库用法解析
Nov 28 Python
python中pow函数用法及功能说明
Dec 04 Python
如何利用opencv判断两张图片是否相同详解
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
文件上传程序的全部源码
2006/10/09 PHP
php 输入输出流详解及示例代码
2016/08/25 PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
2019/08/06 PHP
javascript window对象属性整理
2009/10/24 Javascript
JavaScript中几种常见排序算法小结
2011/02/22 Javascript
jquery简单实现滚动条下拉DIV固定在头部不动
2013/11/25 Javascript
js判断字符是否是汉字的两种方法小结
2014/01/03 Javascript
jquery设置按钮停顿3秒不可用
2014/03/07 Javascript
js 显示base64编码的二进制流网页图片
2014/04/04 Javascript
javascript判断是否按回车键并解决浏览器之间的差异
2014/05/13 Javascript
通过location.replace禁止浏览器后退防止重复提交
2014/09/04 Javascript
javascript 原型链维护和继承详解
2014/11/26 Javascript
JavaScript获取当前运行脚本文件所在目录的方法
2016/02/03 Javascript
详谈jQuery中的一些正则匹配表达式
2017/03/08 Javascript
微信小程序页面传值实例分析
2017/04/19 Javascript
Angular之jwt令牌身份验证的实现
2020/02/14 Javascript
[10:54]Team Spirit vs Navi
2018/06/07 DOTA
Python中bisect的用法
2014/09/23 Python
python从入门到精通(DAY 2)
2015/12/20 Python
python+opencv实现动态物体追踪
2018/01/09 Python
Python Web程序部署到Ubuntu服务器上的方法
2018/02/22 Python
python中如何使用分步式进程计算详解
2019/03/22 Python
Pandas时间序列:时期(period)及其算术运算详解
2020/02/25 Python
python能开发游戏吗
2020/06/11 Python
python利用google翻译方法实例(翻译字幕文件)
2020/09/21 Python
python实现登录与注册系统
2020/11/30 Python
python多线程和多进程关系详解
2020/12/14 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
YSL圣罗兰美妆官方旗舰店:购买YSL口红
2018/04/16 全球购物
英国最大的在线床超市:Bed Star
2019/01/24 全球购物
2019年分享net面试的经历和题目
2016/08/07 面试题
总会计师岗位职责
2014/02/19 职场文书
幼儿园大班教师随笔
2015/08/14 职场文书
CSS 还能这样玩?奇思妙想渐变的艺术
2021/04/27 HTML / CSS
SpringBoot整合JWT的入门指南
2021/06/29 Java/Android
Python函数对象与闭包函数
2022/04/13 Python