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

【写在前面】

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

【示例代码】

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

GUI.py脚本内容如下:

# -*- coding: utf-8 -*-
# @Auther : 鹏哥贼优秀 
# @Date : 2019/8/7

from PyQt5 import QtCore, QtGui, QtWidgets
import sys
import DataBase
import pyperclip

class 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.translate
        dialog.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/7

def GetData():
    data = {}
    with open("DataBase.txt","r") as f:
        lines = f.readlines()
        for line in lines:
            line = line.strip("\n")
            if len(line) == 0:
                continue
            lens = len(line.split(":"))
            key = line.split(":")[0]
            value = line.split(":")[1:lens]
            data.update({key:"".join(value)})
    return data

def WriteData(content):
    if ":" not in content:
        return False
    with open("DataBase.txt","a+")as f:
        f.write("\n")
        f.writelines(content)
    return True

def 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:
                    continue
                f_w.write(line)
        return True
    except:
        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成长之路上的小菜鸟来说,除了自我完成一个个小功能带来的喜悦,大家的认可也是我很棒的动力。如果有兴趣,可以关注我的公众号“鹏哥贼优秀”,谢谢大家能看到这篇文章!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值