1. 程式人生 > >[PyQt] - 使用.qrc生成資原始檔供Python使用

[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