购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.6 打包资源文件

使用PyQt 5生成的应用程序引用图片资源主要有两种方法,第一种方法是将资源文件转换为 Python 文件,然后引用 Python 文件;第二种方法是在程序中通过相对路径引用外部图片资源。由于第一种方法会涉及Qt Designer,所以放在本章介绍;对于第二种方法,使用起来非常简单,读者可以查看第4章中的案例4-7。下面详细介绍第一种方法的实现过程。

3.6.1 使用Qt Designer加载资源文件

在Qt Designer中设计界面时是不能直接加入图片和图标等资源的,而是需要在PyQt开发目录下编写.qrc文件(可以用文本编辑器打开扩展名为.qrc的资源文件)。

(1)新建一个资源文件apprcc.qrc,它的内容如下:

﹤rcc version="1.0"﹥

﹤qresource﹥

﹤/qresource﹥

﹤/rcc﹥

也可以使用Eric创建这个文件,操作如图3- 69所示。然后在弹出的窗口中新建文件apprcc.qrc就可以了,它会自动帮你生成上面的代码。

图3-69

(2)打开 Qt Designer,新建一个类型为 Widget 的简单窗体,该窗体文件名为MainWin02.ui。然后打开资源浏览器,按图3-70所示进行操作(本例涉及的图片在PyQt5/Chapter03/images目录下)。

图3-70

首先进入资源编辑界面,然后打开资源文件,这里打开上面创建的资源文件apprcc.qrc。接下来选中apprcc.qrc,设置图片资源的前缀为 pic。最后添加或删除图片资源。

按照以上步骤添加图片资源后,用文本编辑器查看 apprcc.qrc 文件,发现它是XML格式的。

﹤RCC﹥

﹤qresource prefix="pic"﹥

﹤file﹥images/cartoon1.ico﹤/file﹥

﹤file﹥images/cartoon2.ico﹤/file﹥

﹤file﹥images/cartoon3.ico﹤/file﹥

﹤file﹥images/cartoon4.ico﹤/file﹥

﹤file﹥images/python.jpg﹤/file﹥

﹤/qresource﹥

﹤/RCC﹥

3.6.2 在窗体中使用资源文件

1.使用Qt Designer在窗体中放置控件

继续使用 Qt Designer 操作 MainWin02.ui 文件。在 Qt Designer 窗口左侧,将Display Widgets栏中的Label控件拖到窗体Form中间并选中它,然后在Qt Designer窗口右侧的属性编辑器中找到pixmap属性,单击其后面的按钮,把它的值改为资源文件中的一张图片,如图3-71所示。

2.将.ui文件转换为.py文件

使用pyuic5命令将.ui文件转换为.py文件。

pyuic5-o MainWin02.py MainWin02.ui

图3-71

本例文件名为PyQt5/Chapter03/MainWin02.py,其完整代码如下:

from PyQt5 import QtCore,QtGui,QtWidgets

class Ui_Form(object):

def setupUi(self,Form):

Form.setObjectName("Form")

Form.resize(678,431)

self.label=QtWidgets.QLabel(Form)

self.label.setGeometry(QtCore.QRect(80,30,531,321))

self.label.setText("")

self.label.setPixmap(QtGui.QPixmap(":/pic/images/python.jpg"))

self.label.setObjectName("label")

self.retranslateUi(Form)

QtCore.QMetaObject.connectSlotsByName(Form)

def retranslateUi(self,Form):

_translate=QtCore.QCoreApplication.translate

Form.setWindowTitle(_translate("Form","Form"))

import apprcc_rc

为了使窗口的显示和业务逻辑分离,再新建一个调用窗口显示的文件 CallMain Win02.py,其完整代码如下:

import sys

from PyQt5.QtWidgets import QApplication ,QMainWindow

from MainWin02 import Ui_Form

class MyMainWindow(QMainWindow,Ui_Form):

def __init__(self,parent=None):

super(MyMainWindow,self).__init__(parent)

self.setupUi(self)

if __name__=="__main__":

app=QApplication(sys.argv)

myWin=MyMainWindow()

myWin.show()

sys.exit(app.exec_())

运行 CallMainWin02.py 文件,会抛出如下异常信息,提示在 MainWin02.py 中找不到模块apprcc_rc。

Exception "unhandled ImportError"

No module named 'apprcc_rc'

这说明在脚本中使用以下代码导入的模块异常。

import apprcc_rc

调用脚本还差关键的一步,就是将.qrc文件转换为.py文件,然后导入正常的.py资源文件。

3.6.3 转换资源文件

使用PyQt 5提供的pyrcc5 命令将apprcc.qrc文件转换为apprcc_rc.py文件(之所以添加_rc,是因为 Qt Designer 导入资源文件时默认是加_rc 的,这里是为了与Qt Designer一致)。

pyrcc5 apprcc.qrc-o apprcc_rc.py

转换完成后,在同级目录下会多出一个与.qrc 文件同名的.py 文件。查看apprcc_rc.py文件,其内容如下:

可以看出,该文件已经使用QtCore.qRegisterResourceData 进行了初始化注册,所以可以直接引用该文件。

3.6.4 导入.py资源文件

在界面文件MainWin02.py中,需要使用以下代码直接导入.py资源文件。

import apprcc_rc

在 Qt Designer 中使用图片资源时,图片资源的引入路径是冒号“:”加图片的路径,示例代码如下:

:/pic/images/python.jpg

注意到上面的路径与 qrc 文件的路径稍微有些不同,多了一个前缀“pic”,原因是Qt Designer会自动根据qrc中的qresource标签来调整这个路径。如图3-72所示,在qresource标签中有一个“pic”属性,Qt Designer会自动把“pic”添加到图片路径images/python.jpg中。

图3-72 apprcc_rc.qrc文件

修改后的MainWin02.py文件的完整代码如下:

from PyQt5 import QtCore,QtGui,QtWidgets

class Ui_Form(object):

def setupUi(self,Form):

Form.setObjectName("Form")

Form.resize(678,431)

self.label=QtWidgets.QLabel(Form)

self.label.setGeometry(QtCore.QRect(80,30,531,321))

self.label.setText("")

self.label.setPixmap(QtGui.QPixmap(":/pic/images/python.jpg"))

self.label.setObjectName("label")

self.retranslateUi(Form)

QtCore.QMetaObject.connectSlotsByName(Form)

def retranslateUi(self,Form):

_translate=QtCore.QCoreApplication.translate

Form.setWindowTitle(_translate("Form","Form"))

import apprcc_rc

运行CallMainWin02.py文件,显示效果如图3-73所示。

图3-73

运行脚本一切正常,可以在窗口中看到所导入的图片资源。 Ir0uHCe1BKVvYb5Fu5G8bPbC8Y3+uW2WP4mbhPufw2e5p+/vZcOlHHk3cK+4Gc6B

点击中间区域
呼出菜单
上一章
目录
下一章
×

打开