Pyqt 打包資源文件

     用打包工具將作好的Pyqt程序打包成exe後發現引用的資源圖片都顯示不了?python

     是否遇到了和我同樣的問題呢。google以後找到了方法,一種方法是在程序中引用外部資源,另一種方法是將資源文件轉換爲py文件,而後引用py。下面咱們詳細來實現後者方法實現的過程app

一. 生成資源文件

要把資源文件轉換爲py文件首先要有資源文件,咱們打開Qt Designer,添加資源文件工具

保存好資源文件後綴是以 .qrc  結尾的,用notepad++查看.qrc文件發現該文件其實爲XMLui

 1 <RCC>
 2   <qresource prefix="picture">
 3     <file>img/270r.png</file>
 4     <file>img/440kb.png</file>
 5     <file>img/firefox.png</file>
 6     <file>img/notepad.png</file>
 7     <file>img/python.png</file>
 8     <file>img/cut.png</file>
 9     <file>img/python.jpg</file>
10     <file>img/loading.gif</file>
11   </qresource>
12 </RCC>

二. 建立一個窗體

用Qt Designer 建立一個最簡單的窗體this

而後將.ui文件轉換成 py文件google

 1 # -*- coding: utf-8 -*-
 2 
 3 # Form implementation generated from reading ui file 'resource.ui'
 4 #
 5 # Created: Tue Jan 20 17:17:34 2015
 6 #      by: PyQt4 UI code generator 4.10.3
 7 #
 8 # WARNING! All changes made in this file will be lost!
 9 
10 from PyQt4 import QtCore, QtGui
11 
12 try:
13     _fromUtf8 = QtCore.QString.fromUtf8
14 except AttributeError:
15     def _fromUtf8(s):
16         return s
17 
18 try:
19     _encoding = QtGui.QApplication.UnicodeUTF8
20     def _translate(context, text, disambig):
21         return QtGui.QApplication.translate(context, text, disambig, _encoding)
22 except AttributeError:
23     def _translate(context, text, disambig):
24         return QtGui.QApplication.translate(context, text, disambig)
25 
26 class Ui_resource(object):
27     def setupUi(self, resource):
28         resource.setObjectName(_fromUtf8("resource"))
29         resource.resize(400, 300)
30 
31         self.retranslateUi(resource)
32         QtCore.QMetaObject.connectSlotsByName(resource)
33 
34     def retranslateUi(self, resource):
35         resource.setWindowTitle(_translate("resource", "Form", None))

三. 轉換資源文件

  轉換資源文件用的是Pyqt的pyrcc4 命令spa

1 pyrcc4 qrcfile.qrc -o  pyfile.py

 1.Pycharm集成pyrcc4

      咱們使用Pycharm來集成pyrcc4,這樣更利於咱們高效開發firefox

     首先在菜單裏面找到 File => settings => Tools => External Tools   (外邊工具設置)3d

選擇添加Add code

Name 填寫: Rcc2Py

Group: 自已任意填寫,我填寫的是PyQt4

下面的Options默認

在Tools settings 裏面這樣填寫:

Program 就是你安裝Pyqt4的路徑

Parameters 是指轉換的參數      $FileName$ -o $FileNameWithoutExtension$.py

Working directory 表示輸出在當前的工做目錄   $FileDir$

   2.轉換qrc爲py

選擇要轉換的qrc文件,右鍵,找到group 爲(PyQt4) 目錄下的Rcc2Py

轉換完成後,同級目錄下就多出一個與qrc文件同命名的py文件,查看文件:

 1 # -*- coding: utf-8 -*-
 2 
 3 # Resource object code
 4 #
 5 # Created: 週二 一月 20 11:43:03 2015
 6 #      by: The Resource Compiler for PyQt (Qt v4.8.5)
 7 #
 8 # WARNING! All changes made in this file will be lost!
 9 
10 from PyQt4 import QtCore
11 
12 qt_resource_data = "\
13 \x00\x00\x05\x2b\
14 \x89\
15 \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
16 \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
17 \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xd6\xd8\xd4\x4f\x58\x32\
18 \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
19 \x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
20 \x79\x71\xc9\x65\x3c\x00\x00\x04\xbd\x49\x44\x41\x54\x58\xc3\xed\
21 \x57\x6b\x4c\x93\x57\x18\x3e\x23\x71\xc9\x32\xe9\x16\x97\xa8\x54\
22 \x65\x38\x9d\x02\x15\xf6\x03\x87\x32\x93\x01\x66\x2c\x5b\x70\xc4\
23 \x30\xff\x60\xa2\x2e\x1a\x3a\x1d\x4e\x03\xba\x31\x89\x5b\xb3\x80\
24 \xd9\x0c\x84\x02\x19\x58\x1c\x14\x8b\x85\xb2\x82\x95\x5e\xe4\x66\
25 \x0b\x8e\x31\xf8\xc3\x46\xcb\x2d\x81\x15\xdc\xa8\xc2\x1c\x1b\xb7\
26 \x6a\x69\x91\xf2\xee\xbc\x87\xaf\x0c\xdc\xb8\x0d\x61\xd9\xb2\x93\
27 \x3c\xed\x97\xf3\x7d\xfd\xde\xe7\xbc\xef\xf3\x5e\x4a\x00\x80\xfc\
28 \x93\x20\xff\x0a\x02\x74\x09\x28\x44\x14\xd9\x14\x71\x14\x01\x2b\
29 \x46\x80\xae\xdd\x64\xdd\xc6\x66\x22\x4c\xf8\x95\xc4\x8b\x47\xc8\
30 \xa1\xd3\xf7\xc8\x8e\x97\x3b\x38\x32\x61\x2b\x41\x20\x85\x9c\xbe\
31 \x30\x48\x2e\xdd\x80\x19\x40\x32\xab\x79\x4d\xf4\xbe\xfb\x72\x13\
32 \x68\x64\x06\x91\x04\x5e\xa3\x51\xf4\x06\xee\x85\x47\xf5\xd0\xbd\
33 \x83\xcb\x4d\x20\x9b\x9d\xf6\x40\x74\x2f\xbd\x16\x32\x3d\x20\x89\
34 \x3f\x48\xa5\x2c\x1b\x01\x8c\x31\x79\xc1\xbb\x9d\x88\x4b\xc6\xd7\
35 \xc6\x26\x0e\xa0\x10\xb9\xfd\x42\xfe\xc5\x2b\x36\x46\x8c\x12\x5c\
36 \x4e\x02\x93\xa7\xa7\xa7\x0d\xcc\xd3\x39\xb9\x98\x63\x36\x14\x0a\  
37 …………………………
38 ………………………… # 此處省略1000行
39 …………………………
40 qt_resource_struct = "\
41 \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
42 \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\
43 \x00\x00\x00\x14\x00\x02\x00\x00\x00\x08\x00\x00\x00\x03\
44 \x00\x00\x00\x4e\x00\x01\x00\x00\x00\x01\x00\x00\x3a\x1b\
45 \x00\x00\x00\xce\x00\x00\x00\x00\x00\x01\x00\x09\x24\x4c\
46 \x00\x00\x00\x9c\x00\x00\x00\x00\x00\x01\x00\x01\x90\xfe\
47 \x00\x00\x00\x86\x00\x00\x00\x00\x00\x01\x00\x00\xa3\x09\
48 \x00\x00\x00\x20\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
49 \x00\x00\x00\x6a\x00\x00\x00\x00\x00\x01\x00\x00\x79\x75\
50 \x00\x00\x00\x34\x00\x00\x00\x00\x00\x01\x00\x00\x05\x2f\
51 \x00\x00\x00\xb4\x00\x00\x00\x00\x00\x01\x00\x08\x72\xdb\
52 "
53 
54 def qInitResources():
55     QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
56 
57 def qCleanupResources():
58     QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
59 
60 qInitResources()

該文件已經使用QtCore.qRegisterResourceData 對文件初始化註冊,因此咱們能夠直接引用該文件

四. 引用資源py文件

py文件生成好了如何來引用使用呢?

說對了,引用就這麼簡單

1 import apprcc

使用的時候 冒號 「   : 」  加 圖片的路徑, 如:

1 :/img/firefox.png

運行試試,發現圖片不顯示,爲何呢,由於qrc文件添加過程當中,我加了一個 「前綴」 prefix。  因此,若是在qrc文件中不添加前綴 使用   :/img/firefox.png   是能夠的,但添加了前綴生成的qrc文件 qresource標籤會多一個屬性

1 qresource prefix="picture"

在這裏,正確的使用是:

:picture/img/firefox.png

 

完整的代碼以下:

 1 # -*- coding: utf-8 -*-
 2 
 3 # Form implementation generated from reading ui file 'resource.ui'
 4 #
 5 # Created: Tue Jan 20 17:17:34 2015
 6 #      by: PyQt4 UI code generator 4.10.3
 7 #
 8 # WARNING! All changes made in this file will be lost!
 9 
10 from PyQt4 import QtCore, QtGui
11 
12 try:
13     _fromUtf8 = QtCore.QString.fromUtf8
14 except AttributeError:
15     def _fromUtf8(s):
16         return s
17 
18 try:
19     _encoding = QtGui.QApplication.UnicodeUTF8
20     def _translate(context, text, disambig):
21         return QtGui.QApplication.translate(context, text, disambig, _encoding)
22 except AttributeError:
23     def _translate(context, text, disambig):
24         return QtGui.QApplication.translate(context, text, disambig)
25 
26 class Ui_resource(object):
27     def setupUi(self, resource):
28         resource.setObjectName(_fromUtf8("resource"))
29         resource.resize(400, 300)
30 
31         self.retranslateUi(resource)
32         QtCore.QMetaObject.connectSlotsByName(resource)
33 
34     def retranslateUi(self, resource):
35         resource.setWindowTitle(_translate("resource", "Form", None))
36 
37 
38 import apprcc
39 class showresource(QtGui.QWidget):
40     def __init__(self):
41         super(showresource, self).__init__()
42         self.ui_resource = Ui_resource()
43         self.ui_resource.setupUi(self)
44         self.setWindowTitle('ResourceToPy')
45 
46         palette1 = QtGui.QPalette(self)
47         palette1.setBrush(self.backgroundRole(), QtGui.QBrush(QtGui.QPixmap(':picture/img/firefox.png')))
48         
49         self.setPalette(palette1)
50 
51      # 重載keyPressEvent ,  當按下Esc退出
52     def keyPressEvent(self, event):
53         if event.key() ==QtCore.Qt.Key_Escape:
54             self.close()
55 
56 
57 
58 
59 if __name__ == "__main__":
60     import sys
61     app = QtGui.QApplication(sys.argv)
62     resource = showresource()
63     resource.show()
64     sys.exit(app.exec_())

 

五. 打包運行

我使用的是Pyinstaller打包成單一的exe,運行exe查看效果

相關文章
相關標籤/搜索