pyinstaller打包——图片资源无法显示问题
问题描述
在pyqt或tkinter里面用到图片的时候,pyinstaller打包的程序不能把图片资源弄上,也就是图片无法显示。
解决思路
有些童鞋发邮件问我详细,我干脆在这里重新详细说一下吧。
把图片用base64编码转换成.py文件里面的变量,程序在使用图片前先把相关变量解码,并保存为本地的临时图片,然后即可正常在程序中show,程序加载后就可以删除本地的临时图片。
这是我的原话,再详细一点。
pyinstaller打包不打图片,但是.py文件肯定会打。那么把图片用.py文件保存就是解决问题的核心。也就是把图片用base64编码保存在文件里面。
首先,base64编码是一个用途很广编码方式,它是把二进制数据(0101010,计算机存的东西都是二进制数据),编码成一串可读的字符串。具体可以百度一下。我们这里把一张图片one.png,读取字节流(二进制流)然后base64编码,让图片变成了一串字符串iVBOR..........。很长,一般来说编码之后的大小是之前的3/4倍。这张图片3kb,然后把它base64编码保存到img变量,写出one_png.py文件,大小为4kb。如下图所示。
那么怎么把图片编码呢?可以直接用我下文中给出的Pic2py.py文件。
接下来就是在文件中导入你刚刚生成的one_png.py文件,因为每个图片文件里面都是img变量,所以导入的时候可以用别名,这是python的基本用法了,不再多说。
from one_png import img as png1
from two_png import img as png2
from com_png import img as com
from socket_png import img as socket
from win_png import img as win
然后在主程序中,先把图片编码变量解码保存为图片(参考代码见具体方法里面的第二步,在程序中引用)。这时候图片就有了,你想存在哪里就存在哪里,想怎么用就怎么用,用完想删除就删除。
pyqt的解决方法2:一般pyqt都是用desinger来设计界面,哪里可以把图片生产资源文件,也就是qrc,然后用python自带的工具pyrcc 把他转换成py文件调用即可。详见https://blog.csdn.net/wn0112/article/details/47973953。
具体方法
1 Pic2py.py : 图片转为.py
# -*- coding: utf-8 -*-
# @Time : 2018/6/6 18:29
# @Author : Octan3
# @Email : Octan3@stu.ouc.edu.cn
# @File : Pic2py.py
# @Software: PyCharm
import base64
def pic2py(picture_name):
"""
将图像文件转换为py文件
:param picture_name:
:return:
"""
open_pic = open("%s" % picture_name, 'rb')
b64str = base64.b64encode(open_pic.read())
open_pic.close()
# 注意这边b64str一定要加上.decode()
write_data = 'img = "%s"' % b64str.decode()
f = open('%s.py' % picture_name.replace('.', '_'), 'w+')
f.write(write_data)
f.close()
if __name__ == '__main__':
pics = ["one.png", "two.png", "com.png", "socket.png", "win.png"]
for i in pics:
pic2py(i)
print("ok")
2 在程序中引用
from socket_png import img as socket
...
tmp = open('socket.png', 'wb')
tmp.write(base64.b64decode(socket))
tmp.close()
#现在就能用了,用完(加载到程序里之后)删了就好
os.remove(‘socket.png’)
3 打包即可
pyinstaller -F -w xxx.py
原文:https://blog.csdn.net/Monster_li57/article/details/80601050