PyQT 跟我学做密码管理器(2)

快来打我* 2022-04-03 03:36 258阅读 0赞

PyQT 跟我学做密码管理器(2) ——加载图片资源

声明:本文借鉴https://blog.csdn.net/bigbennyguo/article/details/50755207 修改而来

前言

借鉴的文章是基于python2+pyqt4,本文是基于python3+pyqt5

环境

编辑器:Sublime Text3

操作系统:win10

Python3

所需要的库:主要是PyQT5,因为加了一点拓展功能,所以还有sqlite3,Image,pyinstaller

  1. pip3 install pyqt5
  2. pip3 install pyqt5-tools
  3. pip3 install sqilte3
  4. pip3 install Image
  5. pip3 install pyinstaller

首先是pyqt5, 这个是我们的主要工具,用来做界面的,pyqt5-tools这个库主要是是在用QT Creator设计好界面之后,将ui文件转化为py文件;

sqlite3这个库可以安也可以不安,因为pyqt5里面有一个模块QtSql,它支持sqlite的操作;
Image这个库主要是用来处理一下图片资源,以及最后程序的图标的
pyinstaller 最后将程序转化为可执行的exe文件

加载资源文件

如果做出的这个程序,仅仅是在本机电脑上跑,而不是将它生成一个exe文件,那么没必要把资源文件重新转化。

回到上一节的那个问题,加载资源文件

  1. import sys,sqlite3,os
  2. from PyQt5.QtWidgets import *
  3. from PyQt5.QtGui import QIcon, QFont
  4. from PyQt5.QtCore import *
  5. import images #本地资源文件
  6. class PasswordManagerSystem(QMainWindow):
  7. def __init__(self):
  8. super(PasswordManagerSystem, self).__init__()
  9. self.initToolbar()
  10. self.initDB()
  11. self.initGrid()
  12. #self.current_row = 0
  13. self.setGeometry(300, 300, 650, 300)
  14. self.setWindowTitle('密码管理器')
  15. self.setWindowIcon(QIcon(':images/logo.jpg'))#这个图片是从导入的images 得到的
  16. def initToolbar(self):
  17. newAction = QAction(QIcon(':images/new.png'), 'New Ctrl+N', self)#这个图片是从导入的images 得到的
  18. editAction = QAction(QIcon(':images/edit.png'), 'Edit Ctrl+E', self)#这个图片是从导入的images 得到的
  19. delAction = QAction(QIcon(':images/del.png'), 'Delete', self)#这个图片是从导入的images 得到的
  20. backupAction = QAction(QIcon(':images/backup.png'), 'Backup Ctrl+B', self)#这个图片是从导入的images 得到的

如果仅仅是导入本地图片,可以用下面的语句

  1. newAction = QAction(QIcon('images/new.png'), 'New Ctrl+N', self)

这一句和前面的有什么不同呢? 这里的’images/new.png’是你自己本地文件的路径,并且用的时候,没有前面的冒号,也不用入images这个本地包

但是,话说回来,我们做的这个程序,最终是希望能够转化为exe文件的,转化为exe文件呢,需要用到pyinstaller,而这个pyinstaller加载图片资源有点奇怪,所以这一节,就介绍这个奇怪的方法来解决这个奇怪的问题

转化图片为资源文件

目前代码结构是这样的:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FpcWl5aW5nc2U_size_16_color_FFFFFF_t_70 标题

主要的就是我的图片文件都放在images下面,我们要做的是将这些图片转化为python语言

具体方法如下:

  1. # -*- coding: utf-8 -*-
  2. # @Date : 2018-12-17 17:56:11
  3. # @Author : Jimy_Fengqi (jmps515@163.com)
  4. # @Link : https://blog.csdn.net/qiqiyingse
  5. # @Version : V1.0
  6. # @pyVersion: 3.6
  7. import subprocess, os
  8. images = os.listdir('./images')
  9. #qss = os.listdir('./qss')
  10. f = open('images.qrc', 'w+')
  11. f.write(u'<!DOCTYPE RCC>\n<RCC version="1.0">\n<qresource>\n')
  12. for item in images:
  13. f.write(u'<file alias="images/'+ item +'">images/'+ item +'</file>\n')
  14. #for item in qss:
  15. # f.write(u'<file alias="qss/'+ item +'">qss/'+ item +'</file>\n')
  16. f.write(u'</qresource>\n</RCC>')
  17. f.close()
  18. 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文件的格式,写入内容,其中,关键的代码

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

发表评论

表情:
评论列表 (有 0 条评论,258人围观)

还没有评论,来说两句吧...

相关阅读