[PyQt] - 使用.qrc生成资源文件供Python使用

PyQt开发过程中,在封装到exe文件时,UI资源文件需要再拷贝一份到dist路径下,实在不方便,遂采用使用qrc文件管理资源文件,并利用pyrcc5命令将qrc文件转为py文件,供Python使用。

什么是qrc文件?

qrc文件是XML格式的资源配置文件,记录了硬盘上的文件和对应的资源名称。
qrc文件的格式如下:

<RCC>
	<qresource>
		<file alias = 'xx.jpg'>images/xx.jpg</file>
		<file>help/help.html</file>
	</qresource>
</RCC>

使用qrc生成UI资源文件

qrc文件是XML格式文件,因此可以采用记事本进行创建。
进入资源文件所在路径,新建images.qrc文件,写入所需资源文件,格式如下:

<!DOCTYPE RCC>
<RCC version="1.0">
<qresource>
<file alias="images/0.jpg">images/0.jpg</file>
<file alias="images/1.jpg">images/1.jpg</file>
<file alias="images/2.jpg">images/2.jpg</file>
<file alias="qss/qss.qss">qss/qss.qss</file>
</qresource>
</RCC>

由于qrc文件中的路径为相对路径,因此,qrc 文件中包含的资源文件必须位于.qrc文件所在路径或其子路径下。

qrc文件转py文件

在DOS命令窗中键入pyrcc5 -o images.py images.qrc,将.qrc文件转成.py文件,以供python使用。
执行后,在路径下会生成images.py文件,利用import images导入该py文件即可使用。

import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import images

class Main(QWidget):
    def __init__(self):
        super(Main, self).__init__()

        self.button = QPushButton(self)

        self.button.setGeometry(100, 100, 50, 50)
        # 在程序中使用资源文件(这时候不再需要images文件夹和qss文件夹了)
        # 使用qrc生成的py文件资源时,在原资源路径基础上加上冒号:
        self.button.setStyleSheet("QPushButton{border-image: url(:/images/0.jpg)}")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = Main()
    main.show()
    sys.exit(app.exec_())

利用pyinstaller -F -w main.py对上述代码生成exe文件,生成后的main.exe文件不需要依赖images文件夹即可显示正确的资源。

利用python脚本快速生成py资源文件

下面利用python脚本实现从当前路径下生成相应的py资源文件过程:

import subprocess, os

images = os.listdir('./images')
qss = os.listdir('./qss')
f = open('images.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'pyrcc5 -o images.py images.qrc', stdout = subprocess.PIPE, stdin = subprocess.PIPE, stderr = subprocess.PIPE, creationflags=0x08)

链接:https://pan.baidu.com/s/11hrsyeSutDJMq4NohHA9Bw
提取码:an8u

猜你喜欢

转载自blog.csdn.net/qq_26915769/article/details/84535106