Pyqt 打包资源文件

用打包工具将做好的Pyqt程序打包成exe后发现引用的资源图片都显示不了?

是否遇到了和我一样的问题呢。google之后找到了方法,一种方法是在程序中引用外部资源,另外一种方法是将资源文件转换为py文件,然后引用py。下面我们详细来实现后者方法实现的过程

一. 生成资源文件

要把资源文件转换为py文件首先要有资源文件,我们打开Qt Designer,添加资源文件

保存好资源文件后缀是以 .qrc  结尾的,用notepad++查看.qrc文件发现该文件其实为XML

 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 创建一个最简单的窗体

然后将.ui文件转换成 py文件

 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 命令

1 pyrcc4 qrcfile.qrc -o  pyfile.py

 1.Pycharm集成pyrcc4

我们使用Pycharm来集成pyrcc4,这样更利于我们高效开发

首先在菜单里面找到 File => settings => Tools => External Tools   (外边工具设置)

选择添加Add

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\x2b14 \x8915 \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x0016 \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf417 \x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xd6\xd8\xd4\x4f\x58\x3218 \x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x6519 \x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x6420 \x79\x71\xc9\x65\x3c\x00\x00\x04\xbd\x49\x44\x41\x54\x58\xc3\xed21 \x57\x6b\x4c\x93\x57\x18\x3e\x23\x71\xc9\x32\xe9\x16\x97\xa8\x5422 \x65\x38\x9d\x02\x15\xf6\x03\x87\x32\x93\x01\x66\x2c\x5b\x70\xc423 \x30\xff\x60\xa2\x2e\x1a\x3a\x1d\x4e\x03\xba\x31\x89\x5b\xb3\x8024 \xd9\x0c\x84\x02\x19\x58\x1c\x14\x8b\x85\xb2\x82\x95\x5e\xe4\x6625 \x0b\x8e\x31\xf8\xc3\x46\xcb\x2d\x81\x15\xdc\xa8\xc2\x1c\x1b\xb726 \x6a\x69\x91\xf2\xee\xbc\x87\xaf\x0c\xdc\xb8\x0d\x61\xd9\xb2\x9327 \x3c\xed\x97\xf3\x7d\xfd\xde\xe7\xbc\xef\xf3\x5e\x4a\x00\x80\xfc28 \x93\x20\xff\x0a\x02\x74\x09\x28\x44\x14\xd9\x14\x71\x14\x01\x2b29 \x46\x80\xae\xdd\x64\xdd\xc6\x66\x22\x4c\xf8\x95\xc4\x8b\x47\xc830 \xa1\xd3\xf7\xc8\x8e\x97\x3b\x38\x32\x61\x2b\x41\x20\x85\x9c\xbe31 \x30\x48\x2e\xdd\x80\x19\x40\x32\xab\x79\x4d\xf4\xbe\xfb\x72\x1332 \x68\x64\x06\x91\x04\x5e\xa3\x51\xf4\x06\xee\x85\x47\xf5\xd0\xbd33 \x83\xcb\x4d\x20\x9b\x9d\xf6\x40\x74\x2f\xbd\x16\x32\x3d\x20\x8934 \x3f\x48\xa5\x2c\x1b\x01\x8c\x31\x79\xc1\xbb\x9d\x88\x4b\xc6\xd735 \xc6\x26\x0e\xa0\x10\xb9\xfd\x42\xfe\xc5\x2b\x36\x46\x8c\x12\x5c36 \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\x0142 \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x0243 \x00\x00\x00\x14\x00\x02\x00\x00\x00\x08\x00\x00\x00\x0344 \x00\x00\x00\x4e\x00\x01\x00\x00\x00\x01\x00\x00\x3a\x1b45 \x00\x00\x00\xce\x00\x00\x00\x00\x00\x01\x00\x09\x24\x4c46 \x00\x00\x00\x9c\x00\x00\x00\x00\x00\x01\x00\x01\x90\xfe47 \x00\x00\x00\x86\x00\x00\x00\x00\x00\x01\x00\x00\xa3\x0948 \x00\x00\x00\x20\x00\x00\x00\x00\x00\x01\x00\x00\x00\x0049 \x00\x00\x00\x6a\x00\x00\x00\x00\x00\x01\x00\x00\x79\x7550 \x00\x00\x00\x34\x00\x00\x00\x00\x00\x01\x00\x00\x05\x2f51 \x00\x00\x00\xb4\x00\x00\x00\x00\x00\x01\x00\x08\x72\xdb52 "
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查看效果

时间: 2024-08-06 04:34:42

Pyqt 打包资源文件的相关文章

maven打包资源文件(转)

原文链接:http://blog.csdn.net/u012849872/article/details/51035938 maven工程标准目录结构: src    -main       –bin 脚本库       –java java源代码文件       –resources 资源库,会自动复制到classes目录里       –filters 资源过滤文件       –assembly 组件的描述配置(如何打包)       –config 配置文件       –webapp

pyinstaller打包资源文件及包含eyed3模块时提示找不到libmagic处理

这两天用python写了个小工具,用到了eyed3,用pyinstaller打包时提示找不到libmagic 版本信息: python 3.6.5 pyInstaller 3.4 python-magic-bin 0.4.14 eyeD3 0.88 wxpython 4.0.3 eyeD3 在Windows下使用时,文件名带有中文时乱码,提示找不到文件,解决办法(magic.py 230行左右): if is_unicode: return filename.encode('utf-8') el

Webpack 使用url-loader和file-loader打包资源文件

在js中不仅可以通过import引入js文件,还可以引入图片.视频等资源文件,这样webpack打包时就会把所引入的资源文件也一起打包进来 打包进来的文件会返回一个字符串:即文件的路径 要做到这一点,需要一个工具,file-loader,使用方法很简单那 1. 安装 npm install file-loader --save-dev 2. 配置 { test: /\.(png|jpg|jpeg|gif)$/, use: [ { loader: 'file-loader', options: {

pyinstall打包资源文件

相关代码 main.py import sys import os #生成资源文件目录访问路径 #说明: pyinstaller工具打包的可执行文件,运行时sys.frozen会被设置成True # 因此可以通过sys.frozen的值区分是开发环境还是打包后的生成环境 # # 打包后的生产环境,资源文件都放在sys._MEIPASS目录下 # 修改main.spec中的datas, # 如datas=[('res', 'res')],意思是当前目录下的res目录加入目标exe中,在运行时放在零

关于Laravel中使用Laravel-mix打包资源文件的一个坑

今天在尝试把写了一周的项目用laravel-mix中的 mix.version() 命令生成版本化文件时,遇到了一个报错,大概长这样: fs.js:675 return binding.read(fd, buffer, offset, length, postion); ^ Error: EISDIR: illegal operation on a directory, read at Object.fs.readSync (fs.js:675:18) at ..... 一开始还以为哪里写错了,

打包资源文件到程序

#include <stdio.h> #include <stdlib.h> void FileToArray(const char *srcfile, const char *dstfile) { FILE *file = fopen(srcfile, "rb"); if (file) { FILE *save = fopen(dstfile, "w"); fseek(file, 0, SEEK_END); unsigned int fil

spring/boot 打包,资源/配置/业务文件分离

spring/boot打包,将业务jar包和资源配置文件进行分离打包,打包后的资源在target/release文件夹下面 注意:添加以下配置后,注意修改自己的入口类 <!--相关编译打包依赖--> <build> <plugins> <!--打包jar--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-p

Delphi 中将一些 Dll等生成资源文件打包成一个独立的EXE程序方法步骤

资源文件一般为扩展名为res的文件,其自带的资源编译工具BRCC32.EXE(位于/Delphi/BIN目录下) 1.编写rc脚本文本 用记事本或其它文本编辑器编写一个扩展名为rc的文件,格式分别为在资源文件中的名称->类型->实际文件名称. 例如:要将文件名 demo.Dll的文件打包成一个资源文件,首先 新建一个文本文档,输入内容 mydemoDll RCDATA demo.DLL mydemoDll 和 RCDATA 你可以随便写,这个是为了在使用资源时定义的名称和类型你也可以写成:a

关于在打包Jar文件时遇到的资源路径问题(二)

在关于<关于在打包Jar文件时遇到的资源路径问题(一)>中,以及描述了当资源与可执行JAr分离时的资源路径代码的编写问题,后来想了想,为什么将<Java核心技术卷一>中的程序10-1即ResourceTest的Jar文件放在任何地方都可以执行呢? 图:将原本一起放入目录中的Jar放到桌面上,点击依然能执行 于是我将这个Jar包进行解压,发现在这个包中依然有资源,这就说明了这个包在脱离了原先目录而执行时,依据的资源路径应该是在自己的Jar包中.(至于这个Jar在原先目录时是根据自己包