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 26 Python
CentOS6.5设置Django开发环境
Oct 13 Python
python 列表删除所有指定元素的方法
Apr 19 Python
python实现对文件中图片生成带标签的txt文件方法
Apr 27 Python
mac 安装python网络请求包requests方法
Jun 13 Python
flask-socketio实现WebSocket的方法
Jul 31 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
Oct 11 Python
Python实现SQL注入检测插件实例代码
Feb 02 Python
python实现文件助手中查看微信撤回消息
Apr 29 Python
Python实现最常见加密方式详解
Jul 13 Python
python操作cfg配置文件方式
Dec 22 Python
Python通用验证码识别OCR库ddddocr的安装使用教程
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
PHP 地址栏信息的获取代码
2009/01/07 PHP
PHP array_multisort()函数的使用札记
2011/07/03 PHP
Yii 快速,安全,专业的PHP框架
2014/09/03 PHP
php中ob_get_length缓冲与获取缓冲长度实例
2014/11/20 PHP
php实现转换html格式为文本格式的方法
2016/05/16 PHP
Ajax::prototype 源码解读
2007/01/22 Javascript
js或css文件后面跟参数的原因说明
2010/01/09 Javascript
artdialog的图片/标题以及关闭按钮不显示的解决方法
2013/06/27 Javascript
Javascript实现页面跳转的几种方式分享
2013/10/26 Javascript
jQuery实现弹出窗口中切换登录与注册表单
2015/06/05 Javascript
js实现简洁的滑动门菜单(选项卡)效果代码
2015/09/04 Javascript
javascript跑马灯抽奖实例讲解
2020/04/17 Javascript
js倒计时简单实现代码
2016/08/11 Javascript
浅谈js中对象的使用
2016/08/11 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
2016/10/10 Javascript
vue2.0数据双向绑定与表单bootstrap+vue组件
2017/02/27 Javascript
vue中mint-ui环境搭建详细介绍
2017/04/06 Javascript
解决Vue.js 2.0 有时双向绑定img src属性失败的问题
2018/03/14 Javascript
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
详解key在Vue列表渲染时究竟起到了什么作用
2019/04/20 Javascript
bootstrap datepicker的基本使用教程
2019/07/09 Javascript
解决vue-cli webpack打包开启Gzip 报错问题
2019/07/24 Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
2020/02/01 Javascript
JS可断点续传文件上传实现代码解析
2020/07/30 Javascript
Python  连接字符串(join %)
2008/09/06 Python
用Python shell简化开发
2018/08/08 Python
使用Python实现一个栈判断括号是否平衡
2018/08/23 Python
python3+selenium实现qq邮箱登陆并发送邮件功能
2019/01/23 Python
Sasa莎莎海外旗舰店:香港莎莎美妆平台
2018/03/21 全球购物
PHP面试题-$message和$$message的区别
2015/12/08 面试题
新课培训心得体会
2014/09/03 职场文书
产品委托授权书范本
2014/09/16 职场文书
正风肃纪剖析材料
2014/09/30 职场文书
2016年党风廉政建设承诺书
2016/03/25 职场文书
python四种出行路线规划的实现
2021/06/23 Python
HTML页面中使两个div并排显示的实现
2022/05/15 HTML / CSS