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的几种开发工具介绍
Mar 07 Python
python求解水仙花数的方法
May 11 Python
Python基于numpy灵活定义神经网络结构的方法
Aug 19 Python
python实现简单点对点(p2p)聊天
Sep 13 Python
python 巧用正则寻找字符串中的特定字符的位置方法
May 02 Python
python多任务及返回值的处理方法
Jan 22 Python
Python 利用切片从列表中取出一部分使用的方法
Feb 01 Python
Python配置虚拟环境图文步骤
May 20 Python
Python语言进阶知识点总结
May 28 Python
详解Python中的正斜杠与反斜杠
Aug 09 Python
Windows下pycharm创建Django 项目(虚拟环境)过程解析
Sep 16 Python
pandas中关于apply+lambda的应用
Feb 28 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
淘宝ip地址查询类分享(利用淘宝ip库)
2014/01/07 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
2015/09/20 PHP
php+ajax注册实时验证功能
2016/07/20 PHP
php + nginx项目中的权限详解
2017/05/23 PHP
什么是PHP文件?如何打开PHP文件?
2017/06/27 PHP
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
2018/05/11 PHP
Laravel程序架构设计思路之使用动作类
2018/06/07 PHP
JavaScript 字符串乘法
2009/08/20 Javascript
node.js中的fs.read方法使用说明
2014/12/17 Javascript
js获取时间精确到秒(年月日)
2016/03/16 Javascript
vue实现可增删查改的成绩单
2016/10/27 Javascript
常用jQuery选择器汇总
2017/02/02 Javascript
JS实现根据密码长度显示安全条功能
2017/03/08 Javascript
jQuery使用unlock.js插件实现滑动解锁
2017/04/04 jQuery
Vue2.x中的Render函数详解
2017/05/30 Javascript
详解Webpack DLL用法以及功能
2017/07/11 Javascript
解决vue单页使用keep-alive页面返回不刷新的问题
2018/03/13 Javascript
Angular6 正则表达式允许输入部分中文字符
2018/09/10 Javascript
vue模块拖拽实现示例代码
2019/03/09 Javascript
vue中typescript装饰器的使用方法超实用教程
2019/06/17 Javascript
通过数据库向Django模型添加字段的示例
2015/07/21 Python
python 文件操作删除某行的实例
2017/09/04 Python
使用tensorflow实现矩阵分解方式
2020/02/07 Python
python pptx复制指定页的ppt教程
2020/02/14 Python
Pytorch环境搭建与基本语法
2020/06/03 Python
全球领先的全景影像品牌:Insta360
2019/08/21 全球购物
瑞士男士时尚网上商店:Babista
2020/05/14 全球购物
与C++相比,Java中的数组有什么不同
2014/03/25 面试题
Ruby如何实现动态方法调用
2012/11/18 面试题
国庆65周年演讲稿:回首往昔,展望未来
2014/09/21 职场文书
开展党的群众路线教育实践活动工作总结
2014/11/05 职场文书
2015年前台个人工作总结
2015/04/03 职场文书
前台接待员岗位职责
2015/04/15 职场文书
SpringBoot实现异步事件驱动的方法
2021/06/28 Java/Android
一些让Python代码简洁的实用技巧总结
2021/08/23 Python
Oracle删除归档日志及添加定时任务
2022/06/28 Oracle