PyQT 跟我学做密码管理器(2)
PyQT 跟我学做密码管理器(2) ——加载图片资源
声明:本文借鉴https://blog.csdn.net/bigbennyguo/article/details/50755207 修改而来
前言
借鉴的文章是基于python2+pyqt4,本文是基于python3+pyqt5
环境
编辑器:Sublime Text3
操作系统:win10
Python3
所需要的库:主要是PyQT5,因为加了一点拓展功能,所以还有sqlite3,Image,pyinstaller
pip3 install pyqt5
pip3 install pyqt5-tools
pip3 install sqilte3
pip3 install Image
pip3 install pyinstaller
首先是pyqt5, 这个是我们的主要工具,用来做界面的,pyqt5-tools这个库主要是是在用QT Creator设计好界面之后,将ui文件转化为py文件;
sqlite3这个库可以安也可以不安,因为pyqt5里面有一个模块QtSql,它支持sqlite的操作;
Image这个库主要是用来处理一下图片资源,以及最后程序的图标的
pyinstaller 最后将程序转化为可执行的exe文件
加载资源文件
如果做出的这个程序,仅仅是在本机电脑上跑,而不是将它生成一个exe文件,那么没必要把资源文件重新转化。
回到上一节的那个问题,加载资源文件
import sys,sqlite3,os
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QIcon, QFont
from PyQt5.QtCore import *
import images #本地资源文件
class PasswordManagerSystem(QMainWindow):
def __init__(self):
super(PasswordManagerSystem, self).__init__()
self.initToolbar()
self.initDB()
self.initGrid()
#self.current_row = 0
self.setGeometry(300, 300, 650, 300)
self.setWindowTitle('密码管理器')
self.setWindowIcon(QIcon(':images/logo.jpg'))#这个图片是从导入的images 得到的
def initToolbar(self):
newAction = QAction(QIcon(':images/new.png'), 'New Ctrl+N', self)#这个图片是从导入的images 得到的
editAction = QAction(QIcon(':images/edit.png'), 'Edit Ctrl+E', self)#这个图片是从导入的images 得到的
delAction = QAction(QIcon(':images/del.png'), 'Delete', self)#这个图片是从导入的images 得到的
backupAction = QAction(QIcon(':images/backup.png'), 'Backup Ctrl+B', self)#这个图片是从导入的images 得到的
如果仅仅是导入本地图片,可以用下面的语句
newAction = QAction(QIcon('images/new.png'), 'New Ctrl+N', self)
这一句和前面的有什么不同呢? 这里的'images/new.png'是你自己本地文件的路径,并且用的时候,没有前面的冒号,也不用入images这个本地包
但是,话说回来,我们做的这个程序,最终是希望能够转化为exe文件的,转化为exe文件呢,需要用到pyinstaller,而这个pyinstaller加载图片资源有点奇怪,所以这一节,就介绍这个奇怪的方法来解决这个奇怪的问题
转化图片为资源文件
目前代码结构是这样的:
主要的就是我的图片文件都放在images下面,我们要做的是将这些图片转化为python语言
具体方法如下:
# -*- coding: utf-8 -*-
# @Date : 2018-12-17 17:56:11
# @Author : Jimy_Fengqi (jmps515@163.com)
# @Link : https://blog.csdn.net/qiqiyingse
# @Version : V1.0
# @pyVersion: 3.6
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)
执行完上面的脚本,我们得到了两个文件,一个是images.py(这是我们最终要保留并使用的),一个是images.qrc文件
简单解释一下上面代码的作用:
1.遍历一下images(只放图片资源的目录)这个目录,将这个目录下面的图片文件返回一个list
2.新建一个文件,这个文件的名字叫做images.qrc(名字叫什么无所谓,后缀得是.qrc)
3.按照qrc文件的格式,写入内容,其中,关键的代码
f.write(u'<file alias="images/'+ item +'">images/'+ item +'</file>\n')
就是将真正的文件重新取一个名字,这重新取得名字很重要,将来在代码中引入这个图片得时候,就是用得这个名字
4.通过pyqt5-tools中的pyrcc5工具,将qrc文件转化为py文件
最后在说一句这个qrc文件,如果是通过qt creator加载图片,应该可以自动得到这个qrc文件,只用通过pyqt5-tools中的pyrcc5工具,将qrc文件转化为py文件,就能在代码中使用。(至于是不是这样,试验一下就知道了~)
资源文件得使用
当上一步转化完成之后,最终只用保留images.py这一个文件就好了,目录images以及它里面的内容可以不用保留了
最后引用的时候,首先要导入这images,结合着Qicon来使用