【写在前面】

平时工作中,经常会遇到同事们会咨询些相同的问题,或者经常会忘记某些不常用的口令密码什么的。因此需要经常去找记事本里的记录,然后再复制粘贴发给别人,觉得有点麻烦。刚好有次看一个帖子,也是口令保险箱的内容,其中一句代码“pyperclip.copy(value)” 就可以实现直接将内容复制到剪切板,感觉挺有意思的。因此就基于Pyqt5库,制作了一个GUI版的口令保险箱。

【示例代码】

整个工程里分为2个Py脚本,一个是GUI窗口制作,另一个是DataBase.py,用于从本地txt文件中读写、删除数据的。

GUI.py脚本内容如下:

# -*- coding: utf-8 -*-
# @Auther : 鹏哥贼优秀
# @Date : 2019/8/7from PyQt5 import QtCore, QtGui, QtWidgets
import sys
import DataBase
import pyperclipclass Ui_dialog(object):def __init__(self):self.database = DataBase.GetData()def setupUi(self, dialog):dialog.setObjectName("dialog")dialog.resize(520, 383)dialog.setStyleSheet("")self.pushButton = QtWidgets.QPushButton(dialog)self.pushButton.setGeometry(QtCore.QRect(400, 40, 75, 23))font = QtGui.QFont()font.setFamily("黑体")font.setPointSize(12)self.pushButton.setFont(font)self.pushButton.setStyleSheet("background-color: rgb(0, 255, 0);")self.pushButton.setObjectName("pushButton")self.pushButton_2 = QtWidgets.QPushButton(dialog)self.pushButton_2.setGeometry(QtCore.QRect(400, 120, 75, 23))font = QtGui.QFont()font.setFamily("黑体")font.setPointSize(12)self.pushButton_2.setFont(font)self.pushButton_2.setStyleSheet("background-color: rgb(0, 255, 0);")self.pushButton_2.setObjectName("pushButton_2")self.plainTextEdit = QtWidgets.QPlainTextEdit(dialog)self.plainTextEdit.setGeometry(QtCore.QRect(60, 180, 411, 161))self.plainTextEdit.setToolTip("若点击“添加”,请在该栏内以“XX:XXXX”的方式填写。")font = QtGui.QFont()font.setFamily("新宋体")font.setPointSize(12)self.plainTextEdit.setFont(font)self.plainTextEdit.setPlainText("")self.plainTextEdit.setObjectName("plainTextEdit")self.label = QtWidgets.QLabel(dialog)self.label.setGeometry(QtCore.QRect(70, 140, 101, 31))font = QtGui.QFont()font.setFamily("黑体")font.setPointSize(14)self.label.setFont(font)self.label.setStyleSheet("color: rgb(0, 0, 255);")self.label.setObjectName("label")self.label_2 = QtWidgets.QLabel(dialog)self.label_2.setGeometry(QtCore.QRect(60, 30, 101, 21))font = QtGui.QFont()font.setFamily("黑体")font.setPointSize(14)self.label_2.setFont(font)self.label_2.setStyleSheet("border-image: url(:/1.png);")self.label_2.setObjectName("label_2")self.comboBox_2 = QtWidgets.QComboBox(dialog)self.comboBox_2.setGeometry(QtCore.QRect(60, 60, 251, 31))self.comboBox_2.setObjectName("comboBox_2")# 新增删除按钮self.pushButton3 = QtWidgets.QPushButton(dialog)self.pushButton3.setGeometry(QtCore.QRect(400, 80, 75, 23))font = QtGui.QFont()font.setFamily("黑体")font.setPointSize(12)self.pushButton3.setFont(font)self.pushButton3.setStyleSheet("background-color: rgb(0, 255, 0);")self.pushButton3.setObjectName("pushButton")self.retranslateUi(dialog)QtCore.QMetaObject.connectSlotsByName(dialog)def retranslateUi(self, dialog):_translate = QtCore.QCoreApplication.translatedialog.setWindowTitle(_translate("dialog", "查询GUI界面 "))keys = self.database.keys()self.comboBox_2.addItem("")for i in keys:self.comboBox_2.addItem(i)self.pushButton.setText(_translate("dialog", "添加"))self.pushButton_2.setText(_translate("dialog", "查询"))self.pushButton3.setText(_translate("dialog", "删除"))self.label.setText(_translate("dialog", "结果如下:"))self.label_2.setText(_translate("dialog", "查询条件:"))self.pushButton_2.clicked.connect(self.clickok)self.pushButton.clicked.connect(self.clickadd)self.pushButton3.clicked.connect(self.clickdel)def clickok(self):content = self.comboBox_2.currentText()for key,value in self.database.items():if key == content:self.plainTextEdit.setPlainText(value)pyperclip.copy(value)def clickadd(self):strtext = self.plainTextEdit.toPlainText()result = DataBase.WriteData(strtext)if result == True:self.plainTextEdit.setPlainText("添加成功!")lens = len(strtext.split(":"))key = strtext.split(":")[0]value = strtext.split(":")[1:lens]self.database.update({key: "".join(value)})self.comboBox_2.addItem(key)else:self.plainTextEdit.setPlainText("添加失败,请联系管理员!")def clickdel(self):strtext = self.comboBox_2.currentText()index = self.comboBox_2.currentIndex()result = DataBase.DeleteData(strtext)if result == True:self.plainTextEdit.setPlainText("删除成功!")del self.database[strtext]self.comboBox_2.removeItem(index)else:self.plainTextEdit.setPlainText("删除失败,请联系管理员!")if __name__ == "__main__":app = QtWidgets.QApplication(sys.argv)Dialog = QtWidgets.QDialog()ui = Ui_dialog()ui.setupUi(Dialog)Dialog.show()sys.exit(app.exec())

DataBase.py内容如下:

# coding=utf-8
# @Auther : 鹏哥贼优秀
# @Date : 2019/8/7def GetData():data = {}with open("DataBase.txt","r") as f:lines = f.readlines()for line in lines:line = line.strip("\n")if len(line) == 0:continuelens = len(line.split(":"))key = line.split(":")[0]value = line.split(":")[1:lens]data.update({key:"".join(value)})return datadef WriteData(content):if ":" not in content:return Falsewith open("DataBase.txt","a+")as f:f.write("\n")f.writelines(content)return Truedef DeleteData(content):try:with open("DataBase.txt","r") as f:lines = f.readlines()with open("DataBase.txt","w") as f_w:for line in lines:if content in line:continuef_w.write(line)return Trueexcept:return False

【效果如下】:

不知道为什么无法上传动态图,所以只好文字介绍下。

1、添加功能:在文本框内,以xx:xxxx的格式传入,就会将xx作为口令,添加到下拉条中,xxxx则为口令对应的密码;

2、删除功能:删除当前查询条件中的口令,包括后台txt文件中、内存中的database数据都会进行删除;(这里要说明下,因为在工具启动后,database数据其实读的是内存中的数据,因此如果只删除txt文件中的数据,当前工具使用时还是有对应的口令和密码。)

3、查询功能:选择口令后会查询到对应的密码,同时会自动复制到剪切板中,即可以直接用ctrl+v进行粘贴了,是不是很方便?

【知识点】

1、主要还是Pyqt5库的方法应用,部分函数方法如何使用在上次的文(https://blog.csdn.net/yuzipeng/article/details/98465352)都讲过了,因此这次讲些我遇到的新控件和对应的函数方法。

(1)下拉条comboBox:

comboBox.addItem:给下拉框添加内容,参数是文本内容

comboBox.currentText:获取当前下拉框的文本内容

comboBox.currentIndex:获取当前下拉框文本对应的索引

comboBox.removeItem:删除下拉框中的某个词条,参数是index,注意不是具体的文本内容,而文本对应的索引号。因此在使用时需要 和currentIndex配套使用。

(2)字体、背景、颜色等设置:

setStyleSheet:用于设置控件的风格,比如图片、颜色等

font.setFamily:用于设置字体。

其实这些GUI控件,可以在QT Designer界面设置更方便,毕竟那样是图形化界面。

2、复制到剪切板的命令:pyperclip.copy(),很简单

3、txt文件的读写处理:

       因为我没想到更好的添加方式,因此是通过判断文本框内的“XX:XXXX”中的冒号(必须是英文输入法下的冒号)来识别前面的是口令,后面的内容是密码。

        而针对如何删除文本中某条内容的问题,我是采用了先读取再重新写一次内容的方式,即先将所有文本内容读取放到Lines列表中,然后判断要删除的内容content是不是在Lines里。如果Lines中的line 与content不相同,就重新写入文件中。

这种方法的风险是,如果读取文件后进程异常,会导致txt中的所有内容被清空了。如果大神们有更好的方法,请留言指导下我,谢谢!

【写在最后】

     做为一个开心走在Python成长之路上的小菜鸟来说,除了自我完成一个个小功能带来的喜悦,大家的认可也是我很棒的动力。如果有兴趣,可以关注我的公众号“鹏哥贼优秀”,谢谢大家能看到这篇文章!

【Python成长之路】制作口令保险箱GUI版相关推荐

  1. 【Python成长之路】Python爬虫 --requests库爬取网站乱码(\xe4\xb8\xb0\xe5\xa)的解决方法【华为云分享】

    [写在前面] 在用requests库对自己的CSDN个人博客(https://blog.csdn.net/yuzipeng)进行爬取时,发现乱码报错(\xe4\xb8\xb0\xe5\xaf\x8c\ ...

  2. 【Python成长之路】快速理解复制、浅拷贝、深拷贝

    哈喽大家好,我是鹏哥. 今天想聊聊的主题是 -- 浅拷贝/深拷贝. ~~~上课铃~~~ 赤伶HITA - 赤伶 1 写在前面 浅拷贝.深拷贝的知识点,在python笔试和面试的过程中,经常被作为考题来 ...

  3. 【Python成长之路】Python爬虫 --requests库爬取网站乱码(\xe4\xb8\xb0\xe5\xaf\x8c\xe7\x9)的解决方法

    [写在前面] 在用requests库对自己的CSDN个人博客(https://blog.csdn.net/yuzipeng)进行爬取时,发现乱码报错(\xe4\xb8\xb0\xe5\xaf\x8c\ ...

  4. 【Python成长之路】如何用python开发自己的iphone应用程序,并添加至siri指令

    哈喽大家好,我是鹏哥. 今天想记录的学习主题是 -- 基于pythonista3 app开发自己的iphone应用程序. ~~~上课铃~~~ (由于今天被小伙伴推荐了这首歌,因此就应他的要求,作为此文 ...

  5. Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程–>错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个人 ...

  6. (转)Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...

  7. 【Python成长之路】破解Boss直聘网站滑块验证

    哈喽大家好,我是鹏哥. 今天要记录的内容是 -- 破解Boss直聘网站的滑块验证. -- 上 课 铃-- TuesdayBurak Yeter;Danelle Sandoval - Tuesday 1 ...

  8. 【Python成长之路】如何用2行代码将抖音视频设置成我的手机铃声

    哈喽大家好,我是鹏哥. 今天想学习记录的内容是 -- 如何用python提取视频中的音频. ~~~上课铃~~~ 1 写在前面 本来按我的性子和精力,一周一般只想写一篇博客:但是今天在刷抖音时,发现有个 ...

  9. 在网上购物竟然也能和Python扯上关系!电脑上用自己写的程序购物?别说,QT实现还真挺简单(Python如何利用QT制作电脑的手机版拼多多)

    拼多多现在也是越来越火了,但是不知道大家有没有发现,拼多多似乎一直不能通过网页进行访问.淘宝,京东都有微信客户端,那么怎么拼多多就没有呢?带着这个疑问,我特地去手机爬取了一下拼多多的客户端.(其实也不 ...

最新文章

  1. java ado_Java进击C#——语法之ADO.NET
  2. linux shell 统计行数的8种方法
  3. [IE编程] WebBrowser控件的多页面浏览(Tabbed Browsing)开发接口
  4. Linux下修改命令提示符
  5. 【JS】 JS毫秒值转化为正常格式 或者正常格式转化为毫秒值
  6. ActiveX控件打包成Cab置于网页中自动下载安装
  7. Qt——P12 信号连接信号
  8. java类加载全过程
  9. 正经人一辈子都用不到的 JavaScript 方法总结 (一)
  10. nginx location匹配除了一个路径_nginx部署React项目
  11. 使用 python 管理 mysql 开发工具箱 - 2
  12. 【玩儿法】真不是装X 为了不加班我一直用这些小众软件
  13. HP-Socket精简示例
  14. oracle在运行存储的时候出现:同义词转换不再有效
  15. MySQL日志与备份
  16. 【巨杉数据库SequoiaDB】24 Hours , 数据库研发实录
  17. 万字拆解自嗨锅:造价近百万的直播间,是单场直播GMV破100万的法门吗?
  18. mysql计算年休假天数_如何计算年假多少天
  19. 前端面试----深信服面试题全概
  20. 【开发技巧】-- 一篇女朋友也能看懂的Spring整合第三方支付(微信支付-扫码支付实现篇)

热门文章

  1. STC8H驱动hub75e接口的64*64LED点阵屏
  2. 《数据结构》课程设计任务书[2023-01-24]
  3. 一级减速器课程设计(说明书+CAD装配图、零件图)
  4. HTML小图标的使用(无需下载图标源码)
  5. 用opencv识别路标(不准转弯)
  6. C4D模型工具—切割边
  7. 院士王坚:进入空气稀薄地带
  8. PowerDesigner 数据库建模
  9. android 语音播放
  10. origin调整纵坐标刻度值_微教程:Origin怎样调整坐标轴刻度