Pyqt5 -简洁小软件应用开发目录(二)
初版开发链接:Python-如何制作一个简单的登陆界面【记录】
文章目录
前言
依据上次制作登录界面功能应用的开发,这次增加相关功能:
【1】增加账号密码注册功能;
【2】添加配置参数界面,可在主界面打开配置参数界面,并在配置参数界面修改对应参数,相关参数通过ini配置文件保存至本地和读取;
展示视频:
软件登陆界面及其配置文件展示视频
一、登录界面增加注册账号密码功能
代码如下:[主控制界面]
from functionmodule.login import Login_main
from functionmodule.test_main import Test_window
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QMessageBox
from PyQt5.QtCore import Qt
from Configure.configure import Configures_save
from configparser import ConfigParser
'''
调用两个界面,点击退出,可退回界面
'''
# 保存自定义账号和密码,修改为配置文件保存
# 读取账号密码配置文件
def read_file():
path = "./Configure/user_password.ini"
# 需要实例化一个ConfigParser对象
conf = ConfigParser()
conf.read('{}'.format(path), encoding='utf-8')
date = conf.items("userpassword")
print(date)
# 添加账号
list_user = []
list_password = []
for shuju in date:
if "user_name" in shuju[0]:
list_user.append(shuju[1])
elif "password" in shuju[0]:
list_password.append(shuju[1])
save_information = {"save_zhanghao": list_user}
save_information_password = {"password": list_password}
return save_information,save_information_password
# 登陆流程
def control_ui():
save_information,save_information_password = read_file()
zhanghao = login_ui.lineEdit.text()
password = login_ui.lineEdit_2.text()
if zhanghao in save_information.get("save_zhanghao"):
zhanghao_ret = True
huoqusuoyin = save_information.get("save_zhanghao").index(zhanghao)
else:
print("账号不存在!")
QMessageBox.warning(login_ui, "警告", "账号不存在!", QMessageBox.Cancel)
zhanghao_ret = False
return
mima = save_information_password.get("password")
if password == mima[huoqusuoyin]:
password_ret = True
else:
print("密码输入错误!")
QMessageBox.warning(login_ui, "警告", "密码输入错误!", QMessageBox.Cancel)
password_ret = False
return
if zhanghao_ret == True and password_ret == True:
# 打开主界面
print("打开主界面!")
# 关闭登陆界面
login_ui.close()
# 重置主界面相关参数设置
main_ui.textBrowser.clear()
# 打开主程序运行界面
main_ui.show()
# 注册流程
def zhuche():
zhanghao = login_ui.lineEdit.text()
password = login_ui.lineEdit_2.text()
zhiling = login_ui.lineEdit_3.text()
if zhiling == "8888" :
if len(zhanghao) >= 3 and len(password) >= 3:
print("注册账号密码!")
else:
QMessageBox.warning(login_ui, "警告", "账号密码输入错误!", QMessageBox.Cancel)
return
# 将账号和密码写入配置文件
path = "./Configure/user_password.ini"
conf = ConfigParser()
conf.read('{}'.format(path), encoding='utf-8')
save_information, save_information_password = read_file()
number = save_information.get("save_zhanghao")
if zhanghao in save_information.get("save_zhanghao"):
QMessageBox.warning(login_ui, "警告", "账号已经存在!", QMessageBox.Cancel)
else:
conf.set('userpassword', 'user_name{}'.format(len(number)+1), '{}'.format(zhanghao))
conf.set('userpassword', 'password{}'.format(len(number) + 1),'{}'.format(password))
conf.write(open(path, "w+", encoding="utf-8"))
QMessageBox.warning(login_ui, "提示", "注册账号成功!", QMessageBox.Cancel)
else:
QMessageBox.warning(login_ui, "警告", "指令输入错误,无法注册账号!", QMessageBox.Cancel)
def back_login():
login_ui.show()
main_ui.close()
login_ui.lineEdit.clear()
login_ui.lineEdit_2.clear()
def configure_show():
configue.setWindowFlags(Qt.WindowStaysOnTopHint) #置顶
configue.setWindowModality(Qt.ApplicationModal) #锁定该窗口
configue.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
login_ui = Login_main()
login_ui.pushButton.clicked.connect(control_ui)
login_ui.pushButton_2.clicked.connect(zhuche)
login_ui.show()
main_ui = Test_window()
main_ui.pushButton_3.clicked.connect(back_login)
configue = Configures_save()
main_ui.actionpeizhi.triggered.connect(configure_show)
sys.exit(app.exec_())
二、配置参数界面应用
2.1 首先利用Pyqt5创建UI界面,将.ui界面文件转化为py界面代码:
代码如下:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'configures.ui'
#
# Created by: PyQt5 UI code generator 5.15.3
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(783, 647)
self.gridLayout_2 = QtWidgets.QGridLayout(Form)
self.gridLayout_2.setObjectName("gridLayout_2")
self.tabWidget = QtWidgets.QTabWidget(Form)
self.tabWidget.setTabPosition(QtWidgets.QTabWidget.North)
self.tabWidget.setTabShape(QtWidgets.QTabWidget.Rounded)
self.tabWidget.setElideMode(QtCore.Qt.ElideNone)
self.tabWidget.setObjectName("tabWidget")
self.tab = QtWidgets.QWidget()
self.tab.setObjectName("tab")
self.gridLayout = QtWidgets.QGridLayout(self.tab)
self.gridLayout.setObjectName("gridLayout")
self.listWidget_2 = QtWidgets.QListWidget(self.tab)
self.listWidget_2.setMaximumSize(QtCore.QSize(200, 16777215))
self.listWidget_2.setObjectName("listWidget_2")
self.gridLayout.addWidget(self.listWidget_2, 3, 0, 1, 1)
self.listWidget = QtWidgets.QListWidget(self.tab)
self.listWidget.setMaximumSize(QtCore.QSize(200, 16777215))
self.listWidget.setObjectName("listWidget")
self.gridLayout.addWidget(self.listWidget, 1, 0, 1, 1)
self.label_2 = QtWidgets.QLabel(self.tab)
self.label_2.setMinimumSize(QtCore.QSize(0, 30))
self.label_2.setStyleSheet("background-color: rgb(170, 170, 255);")
self.label_2.setObjectName("label_2")
self.gridLayout.addWidget(self.label_2, 0, 1, 1, 1)
self.label_4 = QtWidgets.QLabel(self.tab)
self.label_4.setStyleSheet("background-color: rgb(170, 170, 127);")
self.label_4.setObjectName("label_4")
self.gridLayout.addWidget(self.label_4, 0, 0, 1, 1)
self.pushButton_2 = QtWidgets.QPushButton(self.tab)
self.pushButton_2.setMinimumSize(QtCore.QSize(0, 30))
self.pushButton_2.setMaximumSize(QtCore.QSize(100, 16777215))
self.pushButton_2.setObjectName("pushButton_2")
self.gridLayout.addWidget(self.pushButton_2, 4, 1, 1, 1, QtCore.Qt.AlignRight)
self.label_3 = QtWidgets.QLabel(self.tab)
self.label_3.setObjectName("label_3")
self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1)
self.treeWidget = QtWidgets.QTreeWidget(self.tab)
self.treeWidget.setLayoutDirection(QtCore.Qt.LeftToRight)
self.treeWidget.setAutoFillBackground(False)
self.treeWidget.setFrameShape(QtWidgets.QFrame.WinPanel)
self.treeWidget.setFrameShadow(QtWidgets.QFrame.Sunken)
self.treeWidget.setObjectName("treeWidget")
self.treeWidget.headerItem().setTextAlignment(0, QtCore.Qt.AlignLeading|QtCore.Qt.AlignVCenter)
item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
item_1 = QtWidgets.QTreeWidgetItem(item_0)
item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
item_1 = QtWidgets.QTreeWidgetItem(item_0)
item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
item_1 = QtWidgets.QTreeWidgetItem(item_0)
self.gridLayout.addWidget(self.treeWidget, 1, 1, 3, 1)
self.tabWidget.addTab(self.tab, "")
self.tab_2 = QtWidgets.QWidget()
self.tab_2.setObjectName("tab_2")
self.tabWidget.addTab(self.tab_2, "")
self.gridLayout_2.addWidget(self.tabWidget, 0, 0, 1, 4)
self.retranslateUi(Form)
self.tabWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.label_2.setText(_translate("Form", "<html><head/><body><p align=\"center\"><span style=\" color:#ff0000;\">配置参数</span></p></body></html>"))
self.label_4.setText(_translate("Form", "<html><head/><body><p align=\"center\">配置文件夹</p></body></html>"))
self.pushButton_2.setText(_translate("Form", "保存"))
self.label_3.setText(_translate("Form", "参数文件列表"))
self.treeWidget.headerItem().setText(0, _translate("Form", "参数名"))
__sortingEnabled = self.treeWidget.isSortingEnabled()
self.treeWidget.setSortingEnabled(False)
self.treeWidget.topLevelItem(0).setText(0, _translate("Form", "新建项目"))
self.treeWidget.topLevelItem(0).child(0).setText(0, _translate("Form", "新建子项目"))
self.treeWidget.topLevelItem(1).setText(0, _translate("Form", "新建项目"))
self.treeWidget.topLevelItem(1).child(0).setText(0, _translate("Form", "新建子项目"))
self.treeWidget.topLevelItem(2).setText(0, _translate("Form", "新建项目"))
self.treeWidget.topLevelItem(2).child(0).setText(0, _translate("Form", "新建子项目"))
self.treeWidget.setSortingEnabled(__sortingEnabled)
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("Form", "配置文件编辑"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("Form", "配置文件编辑2"))
2.2 创建配置参数界面功能模块:
代码如下:【相关配置参数界面的功能皆在此添加或者修改】
from PyQt5.QtWidgets import QApplication, QWidget, QMessageBox,QTreeWidgetItem
from Configure.configures import Ui_Form
from PyQt5.QtGui import QIcon # 用于添加图标
import sys
import os
from configparser import ConfigParser
from PyQt5.QtCore import Qt
import traceback
'''
配置界面控制程序
'''
def zhuangshiqi(func):
def wrapper(self):
try:
func(self)
except Exception:
error = traceback.format_exc()
print("错误异常:", error)
# 这里可以添加日志打印信息
return wrapper
class Configures_save(QWidget,Ui_Form):
def __init__(self):
super().__init__() # 使用超类,继承父类的属性及方法
self.setupUi(self) # 构造窗体界面
self.setWindowIcon(QIcon("./img/result.png"))
self.setWindowTitle("配置界面") # 设置窗体主体
self.initUI() # 构造功能函数
def initUI(self):
# 打开配置文件
self.open_files()
# 连接按钮
self.listWidget.itemClicked.connect(self.dayin)
self.listWidget_2.itemClicked.connect(self.configures)
self.pushButton_2.clicked.connect(self.save_configure)
self.treeWidget.itemDoubleClicked.connect(self.edittext)
# 打开配置文件
@zhuangshiqi
def open_files(self):
mulu = os.listdir(path="./configure_files")
print(mulu)
# 添加配置文件夹目录
self.listWidget.addItems(mulu)
@zhuangshiqi
def dayin(self):
# 获取被选中的文件夹目录
name = self.listWidget.currentItem().text()
print(name)
# 保存选择的目录
self.chance_dir = name
# 获取路径
file_name = os.listdir(path="./configure_files/{}".format(name))
self.listWidget_2.clear()
for filename in file_name:
name = filename.replace(".ini","")
self.listWidget_2.addItem(name)
@zhuangshiqi
def configures(self):
names = self.listWidget_2.currentItem().text()
print(names)
# 保存选择的配置文件
self.chance_configure_file = names
self.configure_write()
# 配置参数写入
@zhuangshiqi
def configure_write(self):
self.treeWidget.clear()
# 打开配置文件
self.path_1 = "./configure_files/{}/{}.ini".format(self.chance_dir,self.chance_configure_file)
print(self.path_1)
# 判断文件是否存在
ret = os.path.isfile(self.path_1)
if ret == False:
return
# 需要实例化一个ConfigParser对象
conf = ConfigParser()
conf.read('{}'.format(self.path_1),encoding='utf-8')
date = conf.items("user")
print(date)
# self.treeWidget.setHeaderLabels(["123","344"])
# 写入数据至界面
number = 0
for shuju in date:
self.treeWidgets = QTreeWidgetItem(self.treeWidget)
self.treeWidgets.setText(number,shuju[0])
# 设置文本位置
self.treeWidgets.setTextAlignment(0, Qt.AlignLeft)
# 添加子节点
child1 = QTreeWidgetItem(self.treeWidgets)
child1.setText(0, shuju[1])
child1.setTextAlignment(0, Qt.AlignHCenter)
child1.setFlags(Qt.ItemIsEnabled | Qt.ItemIsEditable | Qt.ItemIsUserCheckable | Qt.ItemIsSelectable | Qt.ItemIsDragEnabled | Qt.ItemIsDropEnabled)
self.treeWidgets.setExpanded(True)
# # 设置可编辑
# self.treeWidgets.setFlags(Qt.ItemIsEnabled | Qt.ItemIsEditable | Qt.ItemIsUserCheckable | Qt.ItemIsSelectable | Qt.ItemIsDragEnabled | Qt.ItemIsDropEnabled)
@zhuangshiqi
def edittext(self,index):
item = self.treeWidget.currentItem()
print('key=%s,value=%s' % (item.text(0), item.text(1)))
# item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsEditable | Qt.ItemIsUserCheckable | Qt.ItemIsSelectable | Qt.ItemIsDragEnabled | Qt.ItemIsDropEnabled)
@zhuangshiqi
def save_configure(self):
try:
shuju =self.listWidget_2.currentItem().text()
print(shuju)
except Exception as error:
print(error)
return
conf = ConfigParser()
conf.read('{}'.format(self.path_1), encoding='utf-8')
# 保存配置文件,先获取界面中的数据
deta = self.treeWidget.topLevelItemCount()
for i in range(0,deta):
# 循环获取根节点
item = self.treeWidget.topLevelItem(i)
text = item.text(0)
print("获取参数名 {}:".format(i),text)
# 获取子节点
for i in range(item.childCount()):
child = item.child(i)
print('子节点:', child.text(0))
conf.set('user', '{}'.format(text), '{}'.format(child.text(0)))
conf.write(open(self.path_1, "w+", encoding="utf-8"))
# 关闭窗口时触发该函数
def closeEvent(self, event):
reply = QMessageBox.question(self,
'本程序',
"是否要退出程序?",
QMessageBox.Yes | QMessageBox.No,
QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Configures_save()
ex.show()
app.exec_()
2.3 配置参数界面如图:(比较简洁,可自行扩展)
业务功能描述:首先自动读取【配置文件夹】,然后读取不同配置文件夹下的配置文件,也就是【参数文件列表】,并将配置文件中的数据读取,显示到【配置参数】列表内。
保存功能:修改相关配置参数后,点击【保存】,对应参数即保存完毕。
三、在主控制界面中增加连接配置参数界面:
主要代码如下:[主控制界面]在上面代码中有体现,此处不再详述
资源文档链接
链接文档资源地址:https://download.csdn.net/download/Offivensive888/88171204