Python——学员管理系统

目录

前言

一、主窗体设计和子窗体设计

二、运行主窗体和子窗体

三、功能


前言

哈喽!哈喽!(一如既往的招呼声),之前讲解了学员管理系统的窗体设计,既然设计了出来了就接着把学员管理系统写完,所以今天要讲解的内容是学员管理系统的代码部分,完成后我们还可以将学员管理系统进行打包并将其制作成安装软件,但是如何打包并制成安装软件暂时不会讲解

( ꈍᴗꈍ) 鸡蛋花

一、主窗体设计和子窗体设计

   主窗体和子窗体的页面设计在前两篇博客中都有详细讲解,感兴趣的小伙伴可以点击下方链接查看

主窗体

PyQt5设计器——页面设计_hinazhaozhao的博客-CSDN博客https://blog.csdn.net/hinazhaozhao/article/details/132022891?spm=1001.2014.3001.5501子窗体

PyQt5设计器——页面设计(添加/修改窗体)_hinazhaozhao的博客-CSDN博客https://blog.csdn.net/hinazhaozhao/article/details/132248214?spm=1001.2014.3001.5501

二、运行

    1.程序入口
if __name__ == '__main__':
    # 创建应用程序对象M.
    app = QApplication(sys.argv)
    # 创建主窗体对象
    MainWindow = ManagerWindow()
    # 创建我们自定义的窗体对象
    ui = Ui_MainWindow()
    # 设置自定义窗体为主窗体
    ui.setupUi(MainWindow)
    # 设置窗体大小不可更改
    MainWindow.setFixedSize(MainWindow.width(), MainWindow.height())
    # 显示主窗体
    MainWindow.show()
    # 设置应用程序退出
    sys.exit(app.exec_())
     2.创建共享文件
  • 单击鼠标左键选中项目名,选中后单击鼠标右键
  • 在弹出的菜单栏中找到 New
  • 点击 Python File,在弹出的消息框中填入文件名 Students.py (此文件为共享文件)

        

    3.在共享文件里定义学员类、定义列表保存学员信息、自定义函数保存学员信息到文件
# 导入模块
import os

# 定义列表,保存学员信息
students = []


# 保存学员信息的到文件
def saveStudents():
    # 获取当前路径下的文件的完整路径
    current_path = os.getcwd()+'\\students.txt'
    # 以写入模式打开文件
    f = open(current_path,'w+')
    # 循环学员列表
    for item in students:
        # 循环每一个学员对象,格式化写入文件
        f.write(item.name+' '+item.sex+' '+item.telephone+' '+item.term+'\n')
    # 关闭文件
    f.close()


# 定义学员类
class Student(object):
    # 使用init方法给属性赋值
    def __init__(self, name, sex, telephone, term):
        self.name = name
        self.sex = sex
        self.telephone = telephone
        self.term = term
    4.在主窗体中自定义窗体加载时需要执行的函数 (myInitWindow

       把此函数在 setupUi 函数中调用

# 窗体加载时调用
def myInitWindow(self):
    # 表格水平铺满
    self.form_table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
    # 获取表格控件水平表头的字体对象
    font=self.form_table.horizontalHeader().font()
    # 设置粗体
    font.setBold(True)
    # 设置表格控件水平表头的字体
    self.form_table.horizontalHeader().setFont(font)

     5.重写主窗体关闭按钮事件
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from qtpy import QtWidgets

from MainWindow import Ui_MainWindow
from Students import *

# 自定义类,继承主窗体类
class ManagerWindow(QMainWindow):
    # 重写窗体关闭按钮事件
    def closeEvent(self,event):

        # 弹出询问窗口
        result=QtWidgets.QMessageBox.question(self,'退出','是否保存后退出?',
                                              QtWidgets.QMessageBox.Yes|QtWidgets.QMessageBox.No)
        # 判断是否点击的Yes按钮
        if result==QtWidgets.QMessageBox.Yes:
            # 保存学员信息
            saveStudents()
            event.accept()
        else:
            # 执行关闭功能
            event.ignore()

三、功能

    1.读取学员信息功能
# 读取数据文件
def readStudents(self):
    # 获取当前路径下的文件完整路径
    current_path = os.getcwd() + "\\students.txt"
    # 判断文件是否存在
    if os.path.exists(current_path):
        # 如果文件存在,只读模式打开
        f = open(current_path, "r")
        # 循环读取文件的一行
        line = f.readline()
        # 循环判断读取的行是否有内容
        while len(line) > 0:
            # 删除读取字符串中的换行符
            line = line.replace('\n', '')
            # 把每一行读取的字符串通过分隔符空格分隔成字符串列表
            stu_list = line.split(" ")
            # 创建学员对象
            stu = Student(stu_list[0], stu_list[1], stu_list[2], stu_list[3])
            # 把学员对象追加到学员列表中
            students.append(stu)
            # 再次读取一行
            line = f.readline()
        # 关闭文件
        f.close()
    else:
        # 创建文件
        f = open(current_path, "w")
        f.close()
   
# 学员信息显示到table控件中
def loadTable(self):
    # 循环学员信息列表
    for item in students:
        # 获取表格控件的行数
        row = self.form_table.rowCount()
        # 根据行数做索引添加一行
        self.form_table.insertRow(row)
        # 创建列对象,内容是学员名称
        item1 = QTableWidgetItem(item.name)
        # 列内容文本居中
        item1.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
        # 把新创建的列对象设置在表格控件索引row所在行,索引0所在列
        self.form_table.setItem(row, 0, item1)
        item2 = QTableWidgetItem(item.sex)
        item2.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
        self.form_table.setItem(row, 1, item2)
        item3 = QTableWidgetItem(item.telephone)
        item3.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
        self.form_table.setItem(row, 2, item3)
        item4 = QTableWidgetItem(item.term)
        item4.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
        self.form_table.setItem(row, 3, item4)
    2.添加功能

 实现添加窗体的魔术方法(init),添加参数(1.窗体标题;2.主窗体的表格控件;3.选中表格中修改的学员的下标)

# 添加初始化函数,创建对象时自动调用,参数title窗体标题,stu_table是表格控件
# index是学员列表中修改的学员对象的索引
def __init__(self, title, form_table, index):
    super(Ui_add_Dialog, self).__init__()
    self.title = title
    self.form_table = form_table
    self.index = index
    self.setupUi(self)
    self.retranslateUi(self)

 自定义窗体加载的函数,设置添加按钮的槽函数,通过判断窗体标题来更改窗体的标题和图标,以及要显示的数据。在添加窗体的setupUi函数中调用。

# 窗体加载时调用
def myInitWindow(self):
    # 单击保持按钮调用函数
    self.save_btn.clicked.connect(self.add_modify_stu)
    self.man_rbtn.setChecked(True)
    # 如果标题是修改
    if self.title=="修改":
        # 在对应的文本框和单选按钮上显示要修改的表格控件选中列的值
        self.name_lEdit.setText(self.form_table.selectedItems()[0].text())
        if '男'==self.form_table.selectedItems()[1].text():
            self.man_rbtn.setChecked(True)
        else:
            self.woman_rbtn.setChecked(True)
        self.telephone_lEdit.setText(self.form_table.selectedItems()[2].text())
        self.term_lEdit.setText(self.form_table.selectedItems()[3].text())
# 修改/添加学员信息
def add_modify_stu(self):
    # 判断标题来进行添加或修改
    if self.title == "添加":
        self.add_stu()
    else:
        self.modify_stu()

# 添加学员信息
def add_stu(self):
    # 获取姓名并去除前后空格
    name = self.name_lEdit.text().strip()
    sex = "男"

    # 判断“女”单选按钮是否选中
    if self.woman_rbtn.isChecked():
        sex = "女"

    telephone = self.telephone_lEdit.text().strip()
    term = self.term_lEdit.text().strip()
    if not (self.telephone_lEdit.text().isdigit() and (len(telephone) == 11)):
        QMessageBox.information(self, "提示", "请输入11位的电话号码(仅数字)", QMessageBox.Ok)
        return False

    if not (self.term_lEdit.text().isdigit()):
        QMessageBox.information(self, "提示", "学期只能为数字", QMessageBox.Ok)
        return

    # 判断姓名、联系方式、学院、专业、学期是否为空
    if len(name)<=0 or len(telephone)<=0 or len(term)<=0:
        # 如果有一个为空,提示消息并结束此函数
        QMessageBox.information(self, "提示", "请填入完整学员信息", QMessageBox.Ok)
        return

    # 创建学员对象并初始化属性
    newStu = Student(name,sex,telephone,term)
    # 把新学员对象追加到全局的学员列表中
    students.append(newStu)
    # 获取表格控件的行数量
    row = self.form_table.rowCount()
    # 以数量做索引添加一行
    self.form_table.insertRow(row)
    # 以姓名为内容创建表格的一列
    item1 = QTableWidgetItem(name)
    # 文本居中
    item1.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
    # 在表格控件行索引row的列索引0处添加列对象item1
    self.form_table.setItem(row, 0, item1)
    item2 = QTableWidgetItem(sex)
    item2.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
    self.form_table.setItem(row, 1, item2)
    item3 = QTableWidgetItem(telephone)
    item3.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
    self.form_table.setItem(row, 2, item3)

    item4 = QTableWidgetItem(term)
    item4.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
    self.form_table.setItem(row, 3, item4)

    # 消息框询问是否继续添加,接收返回值
    result = QMessageBox.question(self, "消息", "添加成功!是否继续添加?", QMessageBox.Yes | QMessageBox.No)
    # 判断返回值是否消息框的No按钮
    if result == QMessageBox.No:
        # 关闭此窗体
        self.close()
    # 继续添加将小窗体的数据置空
    else:
        self.name_lEdit.clear()
        self.telephone_lEdit.clear()
        self.term_lEdit.clear()

   在主窗体中自定义添加函数(单击添加按钮调用),创建添加窗体对象并传参(标题、表格控件、-1),设置模态方式,大小不可更改,显示窗体。

# 打开添加窗体
def addDialogOpen(self):
    # 创建窗口对象并传参
    self.addDialog =Ui_add_Dialog("添加", self.form_table, -1)
    # 设置窗口以应用程序模态打开
    self.addDialog.setWindowModality(Qt.ApplicationModal)
    # 设置窗口大小不可更改
    self.addDialog.setFixedSize(self.addDialog.width(), self.addDialog.height())
    # 显示添加窗口
    self.addDialog.show()

    3.修改功能
       子窗体中

# 修改学员信息
def modify_stu(self):
    # 获取姓名并去除前后空格
    name = self.name_lEdit.text().strip()
    sex = "男"
    # 判断“女”单选按钮是否选中
    if self.woman_rbtn.isChecked():
        sex = "女"
    telephone = self.telephone_lEdit.text().strip()
    term = self.term_lEdit.text().strip()

    if self.name_lEdit.text().isdigit():
        QMessageBox.information(self, "提示", "请输入正确的姓名(不能为数字)", QMessageBox.Ok)
        return

    if not (self.telephone_lEdit.text().isdigit() and (len(telephone) == 11)):
        QMessageBox.information(self, "提示", "请输入11位的电话号码(仅数字)", QMessageBox.Ok)
        return False

    if not (self.term_lEdit.text().isdigit()):
        QMessageBox.information(self, "提示", "学期只能为数字", QMessageBox.Ok)
        return False

    # 判断姓名、联系方式、学院、专业、学期是否为空
    if len(name) <= 0 or len(telephone) <= 0 or len(term) <= 0:
        # 如果有一个为空,提示消息并结束此函数
        QMessageBox.information(self, "提示", "请填入完整学员信息", QMessageBox.Ok)
        return
    # 设置表格控件中选中列的文本内容
    self.form_table.selectedItems()[0].setText(name)
    self.form_table.selectedItems()[1].setText(sex)
    self.form_table.selectedItems()[2].setText(telephone)
    self.form_table.selectedItems()[3].setText(term)
    # 给学员列表中索引对应的学员对象的属性重新赋值
    students[self.index].name = name
    students[self.index].sex = sex
    students[self.index].telephone = telephone
    students[self.index].term = term
    # 关闭此窗口
    self.close()

   主窗体中

# 打开修改窗体
def modifyDialogOpen(self):
    # 判断用户是否选中
    if self.form_table.currentRow() < 0 or len(self.form_table.selectedItems()) == 0 :

        # 如果有一个为空,提示消息并结束此函数
        QMessageBox.information(None, "提示", "请选中修改的学员信息", QMessageBox.Ok)
        return
    # 获取表格控件选中行的第一列内容
    name = self.form_table.selectedItems()[0].text()
    # 定义变量保存选中学员在学员列表中的索引
    index = 0
    # 循环学员列表
    for item in students:
        # 判断学员对象的姓名是否和选中行的第一列内容相等
        if name == item.name:
            break
        # 学员列表索引加一
        index += 1
    # 创建窗口对象并传参
    self.addDialog = Ui_add_Dialog("修改", self.form_table, index)
    # 设置窗口以应用程序模态打开
    self.addDialog.setWindowModality(Qt.ApplicationModal)
    # 设置窗口不可调整大小
    self.addDialog.setFixedSize(self.addDialog.width(), self.addDialog.height())
    self.addDialog.show()

 

    4.删除功能

主窗体中

# 删除学员信息
def deleteStu(self):
    # 获取表格控件中的选中行索引
    index = self.form_table.currentRow()
    # 判断是否有选中行
    if index < 0 or len(self.form_table.selectedItems()) == 0 :
        # 如果没有选中行,提示消息并结束此函数
        QMessageBox.information(None, "提示", "请选中删除行", QMessageBox.Ok)
        return
    # 消息框询问是否继续添加,接收返回值
    result = QMessageBox.question(None, "消息", "是否删除选中行?", QMessageBox.Yes | QMessageBox.No)
    # 判断返回值是否消息框的No按钮
    if result == QMessageBox.Yes:
        # 获取表格控件选中行第一列的内容
        name = self.form_table.selectedItems()[0].text()
        # 删除表格控件中索引所在行
        self.form_table.removeRow(index)
        # 循环学员列表
        for item in students:
            # 如果学员姓名等于删除行第一列内容
            if item.name == name:
                # 从学员列表中删除此学员
                students.remove(item)
                break

    5.查询功能

主窗体中

# 查询学员信息
def searchStu(self):
    # 获取查询的文本框内容并取消前后空格
    name = self.lineEdit.text().strip()
    # 判断查询内容是否为空
    if len(name) <= 0:
        # 如果为空,提示用户
        QMessageBox.information(None, "提示", "请输入学员姓名", QMessageBox.Ok)
        # 结束此函数
        return
    # 设置表格控件的数据行为0
    self.form_table.setRowCount(0)
    # 清空表格控件的内容,与上面一行共同使用清空所有行
    self.form_table.clearContents()
    # 循环学员列表,重新加载学员信息显示在表格控件
    for item in students:
        if name == item.name:
            # 获取表格控件的行数
            row = self.form_table.rowCount()
            # 根据行数做索引添加一行
            self.form_table.insertRow(row)
            # 创建列对象,内容是学员名称
            item1 = QTableWidgetItem(item.name)
            # 列内容文本居中
            item1.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
            # 把新创建的列对象设置在表格控件索引row所在行,索引0所在列
            self.form_table.setItem(row, 0, item1)
            item2 = QTableWidgetItem(item.sex)
            item2.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
            self.form_table.setItem(row, 1, item2)
            item3 = QTableWidgetItem(item.telephone)
            item3.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
            self.form_table.setItem(row, 2, item3)
            item4 = QTableWidgetItem(item.term)
            item4.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
            self.form_table.setItem(row, 3, item4)
            break
    if name != item.name:
        QMessageBox.information(None, "提示", "此学员不存在", QMessageBox.Ok)

    6.弹出菜单

主窗体中

# 返回表格
def go_back(self):
    # 将表格的行数设置为0,实现清空所有行的效果
    self.form_table.setRowCount(0)
    # 清空表格控件的内容,与上面一行共同使用清空所有行
    self.form_table.clearContents()
    # 清空查询标签中的内容
    self.lineEdit.clear()
    # 调用函数把学员列表内容显示在表格控件中
    self.loadTable()
# 弹出菜单
def rightShowMenu(self):
    # 创建菜单
    rightMenu = QMenu()
    # 在菜单中添加菜单项
    menu1 = rightMenu.addAction("修改")
    # 设置第一个菜单项的鼠标单击的槽函数
    menu1.triggered.connect(self.modifyDialogOpen)
    menu2 = rightMenu.addAction("删除")
    # 设置第二个菜单项的鼠标单击的槽函数
    menu2.triggered.connect(self.deleteStu)
    menu3 = rightMenu.addAction('返回')
    # 设置第三个菜单项的鼠标单击的的槽函数
    menu3.triggered.connect(self.go_back)
    # 把菜单显示在控件中
    rightMenu.show()
    # 菜单退出
    rightMenu.exec_(QCursor.pos())

四、总结

以上便是我的学员管理系统的全部内容,感谢各位小伙伴的观看,过程比较简单,新手小白可以尝试做一做,就当是一个练手的小项目

祝大家七夕快乐!!!拜拜


希望这篇文章能够为正在观看的您提供一些帮助,如果有不理解或想要问的问题就在文章下方评论,大家一起互相交流。( 求交流.jpg 

最后,感谢支持!!!求个赞( 90°鞠躬.jpg 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值