python:treewidght使用、字典使用、鼠标右键功能、Fernet加密、中文保存.bin、文件权限修改、QMessageBox reply使用

主窗口:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'caiya_2.ui'
#
# Created by: PyQt5 UI code generator 5.14.2
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.label = QtWidgets.QLabel(self.centralwidget)
        font = QtGui.QFont()
        font.setFamily("华文楷体")
        font.setPointSize(16)
        self.label.setFont(font)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.verticalLayout.addWidget(self.label)
        self.line = QtWidgets.QFrame(self.centralwidget)
        self.line.setFrameShape(QtWidgets.QFrame.HLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.verticalLayout.addWidget(self.line)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.pushButton.setFont(font)
        self.pushButton.setText("")
        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout.addWidget(self.pushButton)
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.lineEdit.setFont(font)
        self.lineEdit.setObjectName("lineEdit")
        self.horizontalLayout.addWidget(self.lineEdit)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.treeWidget = QtWidgets.QTreeWidget(self.centralwidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.treeWidget.sizePolicy().hasHeightForWidth())
        self.treeWidget.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.treeWidget.setFont(font)
        self.treeWidget.setObjectName("treeWidget")
        self.treeWidget.headerItem().setText(0, "1")
        self.verticalLayout_2.addWidget(self.treeWidget)
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.textBrowser.setFont(font)
        self.textBrowser.setObjectName("textBrowser")
        self.horizontalLayout_3.addWidget(self.textBrowser)
        self.verticalLayout_3 = QtWidgets.QVBoxLayout()
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.textBrowser_2 = QtWidgets.QTextBrowser(self.centralwidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.textBrowser_2.sizePolicy().hasHeightForWidth())
        self.textBrowser_2.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(12)
        self.textBrowser_2.setFont(font)
        self.textBrowser_2.setObjectName("textBrowser_2")
        self.verticalLayout_3.addWidget(self.textBrowser_2)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        font = QtGui.QFont()
        font.setFamily("楷体")
        font.setPointSize(12)
        self.label_3.setFont(font)
        self.label_3.setObjectName("label_3")
        self.horizontalLayout_2.addWidget(self.label_3)
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        font = QtGui.QFont()
        font.setFamily("宋体")
        font.setPointSize(12)
        self.lineEdit_2.setFont(font)
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.horizontalLayout_2.addWidget(self.lineEdit_2)
        self.verticalLayout_3.addLayout(self.horizontalLayout_2)
        self.horizontalLayout_3.addLayout(self.verticalLayout_3)
        self.verticalLayout_2.addLayout(self.horizontalLayout_3)
        self.verticalLayout.addLayout(self.verticalLayout_2)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "mainwindow"))
        self.label.setText(_translate("MainWindow", "电子记录"))
        self.label_3.setText(_translate("MainWindow", "目录"))

 副窗口:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'caiya_3.ui'
#
# Created by: PyQt5 UI code generator 5.14.2
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setAlignment(QtCore.Qt.AlignCenter)
        self.label_3.setObjectName("label_3")
        self.verticalLayout.addWidget(self.label_3)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setObjectName("label_2")
        self.horizontalLayout_2.addWidget(self.label_2)
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setObjectName("lineEdit")
        self.horizontalLayout_2.addWidget(self.lineEdit)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setObjectName("label_4")
        self.horizontalLayout_3.addWidget(self.label_4)
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.horizontalLayout_3.addWidget(self.lineEdit_2)
        self.label_5 = QtWidgets.QLabel(self.centralwidget)
        self.label_5.setObjectName("label_5")
        self.horizontalLayout_3.addWidget(self.label_5)
        self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_3.setObjectName("lineEdit_3")
        self.horizontalLayout_3.addWidget(self.lineEdit_3)
        self.verticalLayout.addLayout(self.horizontalLayout_3)
        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.label_6 = QtWidgets.QLabel(self.centralwidget)
        self.label_6.setObjectName("label_6")
        self.horizontalLayout_4.addWidget(self.label_6)
        self.lineEdit_4 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_4.setObjectName("lineEdit_4")
        self.horizontalLayout_4.addWidget(self.lineEdit_4)
        self.verticalLayout.addLayout(self.horizontalLayout_4)
        self.line = QtWidgets.QFrame(self.centralwidget)
        self.line.setFrameShape(QtWidgets.QFrame.HLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.verticalLayout.addWidget(self.line)
        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
        self.label_7 = QtWidgets.QLabel(self.centralwidget)
        self.label_7.setObjectName("label_7")
        self.horizontalLayout_5.addWidget(self.label_7)
        self.lineEdit_5 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_5.setAlignment(QtCore.Qt.AlignCenter)
        self.lineEdit_5.setObjectName("lineEdit_5")
        self.horizontalLayout_5.addWidget(self.lineEdit_5)
        self.verticalLayout.addLayout(self.horizontalLayout_5)
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setObjectName("label")
        self.verticalLayout.addWidget(self.label)
        self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
        self.textEdit.setObjectName("textEdit")
        self.verticalLayout.addWidget(self.textEdit)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout.addWidget(self.pushButton)
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem)
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setObjectName("pushButton_2")
        self.horizontalLayout.addWidget(self.pushButton_2)
        self.verticalLayout.addLayout(self.horizontalLayout)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "信息输入"))
        self.label_3.setText(_translate("MainWindow", "基本信息"))
        self.label_2.setText(_translate("MainWindow", "标题:"))
        self.label_4.setText(_translate("MainWindow", "姓名:"))
        self.label_5.setText(_translate("MainWindow", "班级:"))
        self.label_6.setText(_translate("MainWindow", "链接:"))
        self.label_7.setText(_translate("MainWindow", "分类:"))
        self.label.setText(_translate("MainWindow", "备注消息:"))
        self.pushButton.setText(_translate("MainWindow", "确定"))
        self.pushButton_2.setText(_translate("MainWindow", "取消"))

 main代码:

import sys
from cryptography.fernet import Fernet
import os
from stat import S_IROTH,S_IWRITE
import struct
import random
import pickle
import qtawesome
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QMessageBox, QTreeWidgetItem, QMenu
from PyQt5.QtCore import Qt
import caiya_2
import caiya_3

key_list=[b'm8jj9QWq2zmebJyvF8d_WFmUGflkfNbP-QVms7gJ4Vc=', b'EcuWvJ2aWUrAJ3Wdt0LmnfJy6ES3YzWvR4MP7ilwCLY=',
          b'00Aj75upYXW1YB9lGm-vWeTulAQ3FWarxH6IumzBAf8=', b'K14MYHjJvQljdIlVPU0TjWYaI_8MmsekwlvU9hE9K4A=',
          b'1jWrIDnrW9IKNW_Q0NKE_jssc-Wad73bfgHVT8GmBpU=', b'OUqmLUQhti5lEdKL6YPYWx94Xmo-QiZBX1t9gK0OvTU=',
          b'5RIhRzs5KS7e3DyKzc_4SN3pmxIlzltLmP8lK1CzP5E=', b'pgAYIISedDl1rK0ag96-B08bOrB3iaoxyU9kOPpKRnw=',
          b'aldczwkDaBwvdtgCgIRU5gGZPtOK25VUAb7cLKc0XT0=', b'94q4-JHp_xaKiSjq1Tto8NAqllCCDYMlkjiCwS1Y9rs=']


class my_mainwindow(object):
    def __init__(self):
        app = QApplication(sys.argv)
        app.setWindowIcon(qtawesome.icon('fa.shield', color='blue'))
        #########################
        self.myMainWindow =MainWindow()
        self.myui = caiya_2.Ui_MainWindow()
        self.myui.setupUi(self.myMainWindow)
        self.Secondary_window = QtWidgets.QMainWindow()
        self.mini = caiya_3.Ui_MainWindow()
        self.mini.setupUi(self.Secondary_window)
        self.Secondary_window.setFixedSize(600, 400)  # 禁止缩放
        self.Secondary_window.setWindowFlags(Qt.WindowMinimizeButtonHint)  # 仅保存缩小按钮
        # self.mini.lineEdit_5.setEnabled(False)
        self.myui.pushButton.setIcon(qtawesome.icon('fa.search', color='blue'))
        #********************************************************************************
        #获取数据
        self.dictforcontent=self.strread(key_list)
        if self.dictforcontent== {}:
            self.dictforcontent={'标题': ['新建条目'],
                  '姓名': ['输入名字~'],
                  '班级': ['xxx'],
                  '链接': ['xxx'],
                  '备注': ['xxx'],
                  'ID': ['xxx']}
        listforsort=set(self.dictforcontent["ID"])
        #end
        #treewidght创建
        self.myui.treeWidget.setHeaderLabels(["目录","简述"])
        for name in listforsort:
            root = QTreeWidgetItem(self.myui.treeWidget)  # 创建节点
            root.setIcon(0, qtawesome.icon('fa.folder', color='green'))
            root.setText(0, name)  # 设置顶级节点文本
            for i in range(len(self.dictforcontent["ID"])):  # 遍历字典的ID值
                value=self.dictforcontent["ID"][i]
                if value==name:
                    child = QTreeWidgetItem(root)  # 创建子节点
                    child.setIcon(0, qtawesome.icon('fa.hand-o-right', color='black'))
                    child.setText(0, self.dictforcontent["标题"][i])  # 设置第一列的值
                    child.setText(1, self.dictforcontent["姓名"][i])  # 设置第二列的值
                    self.myui.treeWidget.setAlternatingRowColors(True)
                    self.myui.treeWidget.addTopLevelItem(root)  # 将创建的树节点添加到树控件中
        #单机绑定事件
        self.myui.treeWidget.clicked.connect(self.gettext)
        #右键功能开启
        self.myui.treeWidget.setContextMenuPolicy(Qt.CustomContextMenu) # 打开右键菜单的策略
        self.myui.treeWidget.customContextMenuRequested.connect(self.do_custom_context_menu_request)# 绑定事件
        #相关变量初始化
        self.Right_click = True  # treewidght的右键功能使能
        self.row_num = -1  # 节点的行号
        self.parent_num = -1  # 存放行的父节点的行号
        self.childcnt = 0 #保存字典选中的inx
        self.lastID=''#保存原始ID
        #按键绑定打开
        self.click_pushbutton(self.myMainWindow)
        #********************************************************************************
        self.myMainWindow.show()
        #####################
        sys.exit(app.exec_())


    def click_pushbutton(self,myMainWindow):
        self.myui.pushButton.clicked.connect(lambda: self.find(myMainWindow))
        self.mini.pushButton.clicked.connect(self.modify)
        self.mini.pushButton_2.clicked.connect(self.miniclose)

    def find(self,myMainWindow):
        findstr = self.myui.lineEdit.text()
        if len(findstr) == 0:
            self.myui.textBrowser_2.clear()
            self.myui.textBrowser_2.setText("空气搜不到哦")
        else:
            cnt_match=0
            self.myui.textBrowser_2.clear()
            for i in range(len(self.dictforcontent["标题"])):
                result = findstr in self.dictforcontent["标题"][i]
                if result==True:
                    cnt_match=cnt_match+1
                    self.myui.textBrowser_2.append("**匹配姓名%d**"%(cnt_match))
                    self.myui.textBrowser_2.append("姓名匹配:%s" % (self.dictforcontent["标题"][i]))
                    self.myui.textBrowser_2.append("目录ID:%s" % (self.dictforcontent["ID"][i]))
            if cnt_match==0:
                self.myui.textBrowser_2.append("未发现匹配内容")

    def gettext(self):
        account=self.myui.treeWidget.currentItem().text(0)
        self.myui.lineEdit_2.setText(account)
        for i in range(len(self.dictforcontent["标题"])):  # 遍历字典的标题值
            value = self.dictforcontent["标题"][i]
            if value == account:
                self.myui.textBrowser.clear()
                self.myui.textBrowser.append("标题:%s" %self.dictforcontent["标题"][i])
                self.myui.textBrowser.append("姓名:%s" % self.dictforcontent["姓名"][i])
                self.myui.textBrowser.append("班级:%s" % self.dictforcontent["班级"][i])
                self.myui.textBrowser.append("链接:%s" % self.dictforcontent["链接"][i])
                self.myui.textBrowser.append("备注:%s" % self.dictforcontent["备注"][i])

    def do_custom_context_menu_request(self,pos):
        row_num = -1  # 当前节点的行号
        parent_num = -1  # 存放当前行的父节点的行号
        if self.myui.treeWidget.selectionModel().selection().indexes() !=[] and self.Right_click:
            for i in self.myui.treeWidget.selectionModel().selection().indexes():
                row_num = i.row()
                parent_num = i.parent().row()
            if parent_num == -1:
                menu = QMenu()
                item1 = menu.addAction(u"删除这一分类")
                item2 = menu.addAction(u"增加一个分类")
                item3 = menu.addAction(u"修改这一分类")
                item4 = menu.addAction(u"增加一条记录")
                action = menu.exec_(self.myui.treeWidget.mapToGlobal(pos))
                if action == item1:
                    IDmodifyflag = 0
                    # 判断当前目录下是否有值
                    for i in self.dictforcontent["ID"]:
                        if i == self.myui.treeWidget.currentItem().text(0):
                            QMessageBox.information(self.myMainWindow, "提醒你一下", "这个目录下面有内容,先删掉内容", QMessageBox.Yes)
                            IDmodifyflag = 1
                            break
                    if IDmodifyflag==0:
                        reply = QMessageBox.question(self.myMainWindow, "问你一下", "你确定要删除吗?",
                                                     QMessageBox.Yes | QMessageBox.No)
                        if reply == QtWidgets.QMessageBox.Yes:
                            delitem = self.myui.treeWidget.currentItem()
                            rootIndex = self.myui.treeWidget.indexOfTopLevelItem(delitem)
                            self.myui.treeWidget.takeTopLevelItem(rootIndex)
                            self.myui.textBrowser_2.clear()
                            self.myui.textBrowser_2.setText("目录删除成功")
                elif action == item2:
                    reply = QMessageBox.question(self.myMainWindow, "问你一下", "确定要增加一条并且目录已经在右下角更新好了吗?",
                                                 QMessageBox.Yes | QMessageBox.No)
                    if reply == QtWidgets.QMessageBox.Yes:
                        IDmodifyflag = 0
                        # 判断顶层节点是否重复
                        # 获取最顶级节点的总数
                        rootCount = self.myui.treeWidget.topLevelItemCount()
                        for i in range(rootCount):
                            # 取得顶层项的item索引地址
                            rootItem = self.myui.treeWidget.topLevelItem(i)
                            rootKey = rootItem.text(0)
                            if rootKey == str(self.myui.lineEdit_2.text()):
                                QMessageBox.information(self.myMainWindow, "提醒你一下", "你重复了", QMessageBox.Yes)
                                IDmodifyflag = 1
                                break
                        if IDmodifyflag==0:
                            root = QTreeWidgetItem(self.myui.treeWidget)  # 创建节点
                            root.setIcon(0, qtawesome.icon('fa.folder', color='green'))
                            root.setText(0, self.myui.lineEdit_2.text())  # 设置顶级节点文本
                            self.myui.textBrowser_2.clear()
                            self.myui.textBrowser_2.setText("目录增加成功")
                elif action == item3:
                    reply = QMessageBox.question(self.myMainWindow, "问你一下", "确定要修改吗?",
                                                 QMessageBox.Yes | QMessageBox.No)
                    if reply == QtWidgets.QMessageBox.Yes:
                        IDmodifyflag = 0
                        # 判断ID是否重复
                        for i in self.dictforcontent["ID"]:
                            if i== self.myui.lineEdit_2.text() and self.myui.lineEdit_2.text()!=self.myui.treeWidget.currentItem().text(0):
                                QMessageBox.information(self.myMainWindow, "提醒你一下", "修改内容已存在", QMessageBox.Yes)
                                IDmodifyflag = 1
                                break
                        if IDmodifyflag == 0:
                            for i in range(len(self.dictforcontent["ID"])):
                                if self.dictforcontent["ID"][i] ==self.myui.treeWidget.currentItem().text(0):
                                    self.dictforcontent["ID"][i]=self.myui.lineEdit_2.text()
                            self.myui.treeWidget.currentItem().setText(0,self.myui.lineEdit_2.text())
                            # 更新数据库
                            self.strwrite(key_list, self.dictforcontent)
                            self.myui.textBrowser_2.clear()
                            self.myui.textBrowser_2.setText("目录修改成功")

                elif action == item4:
                    flagforcontinue=0
                    for i in self.dictforcontent["标题"]:
                        if i=="新增条目":
                            QMessageBox.information(self.myMainWindow, "提醒你一下", "已经有新增的",QMessageBox.Yes)
                            flagforcontinue=1
                            break
                    if flagforcontinue==0:
                        reply = QMessageBox.question(self.myMainWindow, "问你一下", "确定要增加一条吗?",
                                                     QMessageBox.Yes | QMessageBox.No)
                        if reply == QtWidgets.QMessageBox.Yes:
                            self.dictforcontent["标题"].append("新增条目")
                            self.dictforcontent["姓名"].append("记得要修改它哦")
                            self.dictforcontent["班级"].append("xxx")
                            self.dictforcontent["链接"].append("xxx")
                            self.dictforcontent["备注"].append("xxx")
                            self.dictforcontent["ID"].append(self.myui.treeWidget.currentItem().text(0))
                            # 根据传入的节点 Item 和节点名称,增加子节点
                            item = self.myui.treeWidget.currentItem()
                            childItem = QtWidgets.QTreeWidgetItem(item)
                            childItem.setIcon(0, qtawesome.icon('fa.hand-o-right', color='black'))
                            childItem.setText(0, self.dictforcontent["标题"][-1])  # 设置第一列的值
                            childItem.setText(1, self.dictforcontent["姓名"][-1])  # 设置第二列的值
                            self.myui.textBrowser_2.clear()
                            self.myui.textBrowser_2.setText("条目增加成功")
                else:
                    return
            else:
                menu = QMenu()
                item1 = menu.addAction(u"删除这条记录")
                item2 = menu.addAction(u"修改一条记录")
                action = menu.exec_(self.myui.treeWidget.mapToGlobal(pos))
                if action == item1:
                    reply=QMessageBox.question(self.myMainWindow, "问你一下哦", "你确定要删除吗?", QMessageBox.Yes | QMessageBox.No)
                    if reply == QtWidgets.QMessageBox.Yes:
                        delitem=self.myui.treeWidget.currentItem()
                        delitem.parent().removeChild(delitem)
                        self.find_dict_inx(parent_num, row_num)
                        #删除字典对应内容
                        del self.dictforcontent["标题"][self.childcnt]
                        del self.dictforcontent["姓名"][self.childcnt]
                        del self.dictforcontent["班级"][self.childcnt]
                        del self.dictforcontent["链接"][self.childcnt]
                        del self.dictforcontent["备注"][self.childcnt]
                        del self.dictforcontent["ID"][self.childcnt]
                        # 更新数据库
                        self.strwrite(key_list, self.dictforcontent)
                        self.myui.textBrowser_2.clear()
                        self.myui.textBrowser_2.setText("数据删除成功")
                elif action == item2:
                    reply=QMessageBox.question(self.myMainWindow, "问你一下", "确定要修改吗?", QMessageBox.Yes | QMessageBox.No)
                    if reply == QtWidgets.QMessageBox.Yes:
                        self.Right_click=False
                        self.parent_num=parent_num
                        self.row_num=row_num
                        self.find_dict_inx(parent_num,row_num)
                        #显示源数据
                        self.mini.lineEdit.setText(self.dictforcontent["标题"][self.childcnt])
                        self.mini.lineEdit_2.setText(self.dictforcontent["姓名"][self.childcnt])
                        self.mini.lineEdit_3.setText(self.dictforcontent["班级"][self.childcnt])
                        self.mini.lineEdit_4.setText(self.dictforcontent["链接"][self.childcnt])
                        self.mini.textEdit.setText(self.dictforcontent["备注"][self.childcnt])
                        self.lastID=self.myui.treeWidget.topLevelItem(self.parent_num).text(0)
                        self.mini.lineEdit_5.setText(self.lastID)
                        self.Secondary_window.show()
                else:
                    return

    def find_dict_inx(self,userparent_num,userrow_num):
        self.childcnt=0
        toptreename = self.myui.treeWidget.topLevelItem(userparent_num).text(0)
        for i in range(len(self.dictforcontent["ID"])):
            if self.dictforcontent["ID"][i] == toptreename:
                self.childcnt = self.childcnt + 1
                if self.childcnt == (userrow_num + 1):
                    self.childcnt = i
                    break

    def modify(self):
        modifyflag=0
        IDchanged=0
        IDexist=0
        #判断新建标题是否重复
        for i in range(len(self.dictforcontent["标题"])):
            if self.dictforcontent["标题"][i] == str(self.mini.lineEdit.text()) and i!=self.childcnt:
                QMessageBox.information(self.myMainWindow, "提醒你一下", "你的标题重复", QMessageBox.Yes)
                modifyflag = 1
                self.Right_click = True
                break
        #判断ID是否当前已存在
        for i in self.dictforcontent["ID"]:
            if i == str(self.mini.lineEdit_5.text()):
                IDexist=1
                break
        if IDexist==0:
            QMessageBox.information(self.myMainWindow, "提醒你一下", "你的分类不存在", QMessageBox.Yes)
            modifyflag = 1#ID不存在
            self.Right_click = True
        elif str(self.mini.lineEdit_5.text())==self.lastID:
            IDchanged=1#ID未改变
        #不重复则更新数据
        if modifyflag==0:
            #更新数据
            self.dictforcontent["标题"][self.childcnt]=str(self.mini.lineEdit.text())
            self.dictforcontent["姓名"][self.childcnt]=str(self.mini.lineEdit_2.text())
            self.dictforcontent["班级"][self.childcnt]=str(self.mini.lineEdit_3.text())
            self.dictforcontent["链接"][self.childcnt]=str(self.mini.lineEdit_4.text())
            self.dictforcontent["备注"][self.childcnt]=str(self.mini.textEdit.toPlainText())
            if IDchanged==1:
                #更新treewidght
                self.myui.treeWidget.topLevelItem(self.parent_num).child(self.row_num).setText(0, self.dictforcontent["标题"][self.childcnt])
                self.myui.treeWidget.topLevelItem(self.parent_num).child(self.row_num).setText(1, self.dictforcontent["姓名"][self.childcnt])
            elif IDchanged==0:
                self.dictforcontent["ID"][self.childcnt]=str(self.mini.lineEdit_5.text())
                #删除当前tree
                delitem_parent = self.myui.treeWidget.topLevelItem(self.parent_num)
                delitem=delitem_parent.child(self.row_num)
                delitem.parent().removeChild(delitem)
                #别的tree去新建
                rootCount = self.myui.treeWidget.topLevelItemCount()
                print(rootCount)
                for i in range(rootCount):
                    # 取得顶层项的item索引地址
                    rootItem = self.myui.treeWidget.topLevelItem(i)
                    rootKey = rootItem.text(0)
                    print(rootKey)
                    print(self.mini.lineEdit_5.text())
                    if rootKey==str(self.mini.lineEdit_5.text()):
                        print("进来了")
                        # 根据传入的节点 Item 和节点名称,增加子节点
                        childItem = QtWidgets.QTreeWidgetItem(rootItem)
                        childItem.setIcon(0, qtawesome.icon('fa.hand-o-right', color='black'))
                        childItem.setText(0, self.dictforcontent["标题"][self.childcnt])  # 设置第一列的值
                        childItem.setText(1, self.dictforcontent["姓名"][self.childcnt])  # 设置第二列的值
                        break
            # 更新数据库
            self.strwrite(key_list, self.dictforcontent)
            self.myui.textBrowser_2.clear()
            self.myui.textBrowser_2.setText("数据修改成功")
            # 关闭窗口
            self.Right_click = True
            self.Secondary_window.close()

    def miniclose(self):
        self.Right_click = True
        self.Secondary_window.close()

    def strwrite(self,keys, write_dict):
        isfile = os.path.exists('./Data/Database.bin')
        if not isfile:
            self.myui.textBrowser.clear()
            self.myui.textBrowser.append("完蛋,数据库不翼而飞!")
        else:
            key_inx = random.randint(0, 9)
            # 创建加密工具
            cipher = Fernet(keys[key_inx])
            # 字典转为字符串(bytes数据类型)
            serialized = pickle.dumps(write_dict)
            # 进行加密
            encrypted_text = cipher.encrypt(serialized)
            # bytes数据类型转为str数据类型
            encrypted_str = encrypted_text.decode("unicode_escape")
            # 字符串转为asii码
            encrypted_strtoasii = []
            for i in encrypted_str:
                encrypted_strtoasii.append(ord(i))  # ord为将字符串转为asii码数
            encrypted_strtoasii.append(key_inx)
            # 文件权限修改为读写
            os.chmod("./Data/Database.bin", S_IWRITE)
            # 写入内容
            with open("./Data/Database.bin", "wb") as fp:  # a表示在文档末尾添加内容,w则表示清除原来的内容从新写 b表示以二进制形式打开
                for x in encrypted_strtoasii:
                    a = struct.pack("B", x)  # 将整数转换为二进制字符串
                    fp.write(a)
            # 文件权限修改为只读
            os.chmod("./Data/Database.bin", S_IROTH)

    def strread(self,keys):
        ispath = os.path.exists('./Data')
        if not ispath:
            os.makedirs(r"./Data")
        isfile = os.path.exists('./Data/Database.bin')
        if not isfile:
            with open('./Data/Database.bin', 'ab') as fp:
                pass
        # 读取文件数据
        with open("./Data/Database.bin", "rb") as fp:
            text = fp.read()
            content = struct.unpack("B" * len(text), text)  # 解包
        strlist = []
        decrypted_str = ""
        deserialized = {}
        if len(content)==0:
            keyinx=-1
        else:
            keyinx = int(content[-1])
        if len(content) == 0:
            self.myui.textBrowser_2.clear()
            self.myui.textBrowser_2.append("数据库空空如也")
        elif len(content) % 2 == 0 or keyinx > 9 or keyinx < 0:
            self.myui.textBrowser_2.clear()
            self.myui.textBrowser_2.append("数据库好像有问题,删掉从新来过")
        else:
            self.myui.textBrowser_2.clear()
            self.myui.textBrowser_2.setText("请尽情查看^_^")
            try:
                for i in range(int(len(content)-1)):
                    a = content[i]
                    strlist.append(chr(a))  # chr表示将asii码转为对应字符
            except Exception as exc:
                returnlist = str(exc)
                self.myui.textBrowser_2.clear()
                self.myui.textBrowser_2.setText(returnlist)
            else:
                self.myui.textBrowser_2.setText("数据库没问题")
                # 字符列表转为字符串
                decrypted_str = decrypted_str.join(strlist)
            # 字符串转为bytes数据类型
            decrypted_str_text = decrypted_str.encode("unicode_escape")
            # 进行解密
            cipher = Fernet(keys[keyinx])
            decrypted_text = cipher.decrypt(decrypted_str_text)
            # 字符串转为字典
            deserialized = pickle.loads(decrypted_text)
        return deserialized


class MainWindow(QtWidgets.QMainWindow):
    """对QMainWindow类重写,实现一些功能"""
    def closeEvent(self, event):
        """重写该方法主要是解决打开子窗口时,如果关闭了主窗口但子窗口仍显示的问题,
        使用sys.exit(0) 时就会只要关闭了主窗口,所有关联的子窗口也会全部关闭"""
        sys.exit(0)

if __name__=='__main__':
    my_mainwindow()

 

posted @ 2023-04-02 11:14  菜芽caiya  阅读(63)  评论(0编辑  收藏  举报