用打包工具将作好的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
咱们使用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$
选择要转换的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文件生成好了如何来引用使用呢?
说对了,引用就这么简单
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查看效果