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来使用

 

 

posted @ 2018-12-20 13:43  枫奇丶宛南  阅读(51)  评论(0编辑  收藏  举报