pyqt 加载资源文件

对于pyqt,一般来说,UI界面设计通常是使用qtdesigner来直接拖拽布局,当然也可以直接用代码来布局内容

但是在布局界面和代码都设计完成需要打包生成exe文件的时候,一般会遇到资源文件不能打包。

这里展示一些加载资源文件的方法

1.将资源文件转化qcr文件

建立qrc文件,在里面保存资源文件的位置:

resource.qrc

<!DOCTYPE RCC> 
<RCC version="1.0"> 
<qresource> 
<file alias="images/pic.png">images/pic.png</file> 
<file alias="images/search.png">images/search.png</file>
</qresource> 
</RCC>

然后将资源文件转换为py文件

pyrcc4 -o resource.py resource.qrc

最后我们就能在代码中引用这些资源文件了

import resource

# 在程序中使用
icon = QIcon(':/icons/add.png')

通过下面的代码可以一键转化

# -*- coding: utf-8 -*-
# @Date     : 2018-12-14 14:02:35
# @Author   : Jimy_Fengqi (jmps515@163.com)
# @Link     : https://blog.csdn.net/qiqiyingse
# @Version  : V1.0
# @pyVersion: 3.6

import subprocess, os 
images = os.listdir('./images') 
qss = os.listdir('./qss') 
f = open('resource.qrc', 'w+') 
f.write(u'<!DOCTYPE RCC>\n<RCC version="1.0">\n<qresource>\n') 
for item in images: 
	f.write(u'<file alias="images/'+ item +'">images/'+ item +'</file>\n') 
for item in qss: 
	f.write(u'<file alias="qss/'+ item +'">qss/'+ item +'</file>\n') 
f.write(u'</qresource>\n</RCC>') 
f.close() 

pipe = subprocess.Popen(r'pyrcc4 -o resource.py resource.qrc', stdout = subprocess.PIPE, stdin = subprocess.PIPE, stderr = subprocess.PIPE, creationflags=0x08)

2.将资源文通过base64编码保存在文件

import base64
 
def pictopy(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:
        pictopy(i)
    print("ok")

在程序中使用:

from pic1_png import img as pic1
...
tmp = open('pic1.png', 'wb')
tmp.write(base64.b64decode(socket))
tmp.close()
#现在就能用了,用完(加载到程序里之后)删了就好
os.remove(‘pic1.png’)

两种方法的比较

两种方法都是在转换完之后可以把原有的资源文件丢弃掉了

但是第二种方法呢,在程序运行的时候,还需要重新生成临时变量,感觉有点浪费资源

目前不太清楚第一种方法是不是同样的思路,待以后观察吧。

posted @ 2018-12-14 16:30  枫奇丶宛南  阅读(91)  评论(0编辑  收藏  举报