用pyinstaller打包时的图标问题

efonfighting 2020-02-16 原文

用pyinstaller打包时的图标问题

前言

因为昨天重新研究了下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("'")

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

  • 然后我们在我们要打包的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文件,然后就可以发布了!

参考

  • 《一种使用pyinstaller时图标问题解决方案》:https://www.cnblogs.com/it-tsz/p/10534688.html

一番雾语:等日更完了一番一定好好发软件版本~

发表于
2020-02-16 20:35 
efonfighting 
阅读(
评论(
编辑 
收藏

 

版权声明:本文为efonfighting原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/efonfighting/p/12318585.html

用pyinstaller打包时的图标问题的更多相关文章

随机推荐

  1. Windows10官方原版系统下载安装制作方法

    Windows10官方原版系统下载安装制作方法 去官网下载系统安装程序      点进去 https://ww […]...

  2. JVM系列6-GC算法

    JVM系列6-GC算法 Posted on 2020-07-16 00:26  只会一点java  阅读(&# […]...

  3. gulp&sass安装配置

    gulp&sass安装配置 首先需要nodejs和npm 然后安装Gulp及其Sass预处理器 在主题 […]...

  4. Java 常用类-程序员头大的日期时间API

    第二节、日期时间API 一、JDK8之前日期时间API 1.1 java.lang.System类 Syste […]...

  5. DoesNotExist at /admin/

    DoesNotExist at /admin/ User has no account. Request Me […]...

  6. TKE基于弹性网卡直连Pod的网络负载均衡

    前言 Kubernetes在集群接入层设计并提供了两种原生资源Service和Ingress,分别负责四层和七 […]...

  7. 最严格的身份证校验(JavaScript版)

          在JavaWeb研发过程中为了获取有效的用户信息,校验其数据的有效性非常是必要,以下贴出在项目中用 […]...

  8. Node.js对SQLite的async/await封装

    用于将每个SQLite函数同步化,并可以用await的接口。 SQLite最常用作本地或移动应用程序的存储单元 […]...

展开目录

目录导航