pyinstaller打包GUI程序时的图片处理——图片资源无法显示问题

问题描述

在pyqt或tkinter里面用到图片的时候,pyinstaller打包的程序不能把图片资源弄上,也就是图片无法显示。

解决思路

(Demo https://github.com/Duola-li/PyinstallerWithPicture)

 

有些童鞋发邮件问我详细,我干脆在这里重新详细说一下吧。

把图片用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

假设我们需要用的图片是 :"one.png", "two.png", "com.png", "socket.png", "win.png"。现在我们用下面这个Pic2py.py工具,把图片转换成pyinstaller能够识别的 .py 后缀文件。

图片放到Pic2py.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")

运行完后,我们的到了每个图片对应的py文件

"one_png.py", "two_png.py".....

每个文件里面内容都是一个img变量

img = xxxxxxxx(图片的base64编码)

 

2 在程序中引用

现在我们在文件中引用这个py图片。加入我们需要用到 one.png 这张图片,那么我们导入相应的one_png.py文件(咳咳,python的包导入不清楚的百度一下)

然后在程序运行后,需要用到这个图片的时候,我们把图片搞出来。解码,写入文件。

就像是我们带着干粮,随时生火做饭。

from one_png import img as one    #引入img变量,赋别名为one
...
tmp = open('one.png', 'wb')        #创建临时的文件
tmp.write(base64.b64decode(one))    ##把这个one图片解码出来,写入文件中去。
tmp.close()                
#现在就能用了,用完(加载到程序里之后)删了就好

#xxxxxx     #这里one.png 就已经拿出来了,可以用来。下面就可以对此进行你想要的操作了。
do_something_with(one.png)        #做任何你想做的
#xxxxxx    


os.remove('one.png')    #用完可以删除这个临时图片

这样程序打包的时候,就不需要带着one.png, 而是把one_png.py打包,用的时候程序自己把图片写入文件。

 

3 打包即可

pyinstaller -F -w xxx.py

4 Demo 实例

说了半天,不如来个实例代码跑一跑有效果。我把最最最简单的demo整理了一下,大家可以参考代码进行修改学习:https://github.com/Duola-li/PyinstallerWithPicture

 

 

  • 30
    点赞
  • 126
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
PyInstaller是一个用于将Python程序打包成可执行文件的工具。它可以将PythonGUI程序打包成可在不同操作系统上运行的独立应用程序。 要使用PyInstaller打包GUI程序,首先需要安装PyInstaller库。可以使用命令"pip install PyInstaller"来安装PyInstaller。 在安装好PyInstaller后,可以使用subprocess库调用系统里的pyinstaller.exe和pyi-makespec来进行打包。通过调用这两个命令,可以制作完成程序本身的打包。 具体操作步骤如下: 1. 安装PyInstaller库:运行命令"pip install PyInstaller"来安装PyInstaller。 2. 进入GUI程序所在的目录:使用命令行切换到GUI程序所在的目录。 3. 执行PyInstaller命令:运行命令"pyinstaller your_program.py"来使用PyInstaller进行打包,其中your_program.py是你的GUI程序的文件名。 4. 等待打包完成:PyInstaller会自动分析你的程序依赖的模块和资源文件,并将它们打包到一个独立的可执行文件中。等待打包过程完成。 5. 完成打包打包完成后,在dist目录下会生成一个可执行文件,可以将这个文件复制到其他机器上运行。 请注意,使用PyInstaller打包GUI程序可能会遇到一些问题,比如依赖库的路径问题资源文件的加载问题等。如果遇到问题,可以查看PyInstaller的官方文档或者在相关的技术论坛上寻求帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [pyinstaller打包python GUI程序](https://blog.csdn.net/i_Truth/article/details/86739331)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [pyinstaller打包程序图形界面版](https://download.csdn.net/download/zjp1981/10910260)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值