Python-如何制作一个简单的登陆界面加上参数配置界面【二版】

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山中坐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值