[PyQt] - 使用.qrc生成資原始檔供Python使用
阿新 • • 發佈:2018-11-26
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