目录
前言
哈喽!哈喽!(一如既往的招呼声),之前讲解了学员管理系统的窗体设计,既然设计了出来了就接着把学员管理系统写完,所以今天要讲解的内容是学员管理系统的代码部分,完成后我们还可以将学员管理系统进行打包并将其制作成安装软件,但是如何打包并制成安装软件暂时不会讲解
( ꈍᴗꈍ) 鸡蛋花
一、主窗体设计和子窗体设计
主窗体和子窗体的页面设计在前两篇博客中都有详细讲解,感兴趣的小伙伴可以点击下方链接查看
主窗体
二、运行
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 )