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()