利用python语言实现成绩管理系统的实现,以某班学生为例,实现以下功能:
(1) 添加学生信息以及其九科成绩信息;
(2) 将学生信息保存在文件中;
(3) 修改和删除学生信息;
(4) 查询学生信息;
(5) 显示已经添加的所有学生信息。
设计要求:
1.具有主菜单界面显示。
2.有良好的GUI人机交互界面。
3.提示错误格式信息并重新输入。
4.具有输入验证和错误提示。
import tkinter as tk
from tkinter import messagebox, simpledialog
import pickle
class GradeManagementSystem:
def __init__(self, root):
"""初始化基本的属性和变量,包括一个Tkinter根窗口(root)、学生列表(students)、以及用于存储学生姓名、ID和分数的变量"""
self.root = root
self.root.title("成绩管理系统")
self.students = self.load_students()
self.name_var = tk.StringVar() # 字符串变量,可以与 Tkinter 控件交互
self.id_var = tk.StringVar()
self.scores_var = [tk.StringVar() for _ in range(9)]
self.setup_widgets()
def setup_widgets(self):
tk.Label(self.root, text="姓名").grid(row=0, column=0) # 在主窗口添加标签
tk.Entry(self.root, textvariable=self.name_var).grid(row=0, column=1) # 在主窗口添加文本输入框并与姓名双向绑定
tk.Label(self.root, text="学号").grid(row=1, column=0)
tk.Entry(self.root, textvariable=self.id_var).grid(row=1, column=1)
for i in range(9):
tk.Label(self.root, text=f"成绩{i + 1}").grid(row=2 + i, column=0)
tk.Entry(self.root, textvariable=self.scores_var[i]).grid(row=2 + i, column=1)
# 在主窗口添加按钮并绑定事件指定执行函数
tk.Button(self.root, text="添加学生", command=self.add_student).grid(row=12, column=0)
tk.Button(self.root, text="显示所有学生", command=self.show_students).grid(row=12, column=1)
tk.Button(self.root, text="查询学生", command=self.query_student).grid(row=13, column=0)
tk.Button(self.root, text="修改学生信息", command=self.update_student).grid(row=13, column=1)
tk.Button(self.root, text="删除学生", command=self.delete_student).grid(row=14, column=0)
tk.Button(self.root, text="退出", command=self.root.quit).grid(row=14, column=1, sticky="se")
# 添加学生
def add_student(self):
name = self.name_var.get() # 从界面元素输入框中获取当前的值
student_id = self.id_var.get()
scores = [self.scores_var[i].get() for i in range(9)]
# 错误信息处理
if not all([name, student_id] + scores): # 列表拼接后判断元素是否为0
messagebox.showerror("错误", "所有字段都必须填写!") # 弹出错误警告对话框
return
if student_id in self.students:
messagebox.showerror("错误", "学号已存在!")
return
# 成绩异常处理,程序继续执行
try:
scores = [float(score) for score in scores] # 转为浮点数
except ValueError:
messagebox.showerror("错误", "成绩必须是数字!")
return # 退出
self.students[student_id] = {'name': name, 'scores': scores}
self.save_students()
messagebox.showinfo("成功", "学生添加成功!") # 弹出信息提示对话框
# 调用pickle模块保存文件
def save_students(self):
with open("students.data", "wb") as f: # 使用with语句打开(如果文件不存在则创建)一个名为students.data的文件用于二进制写入("wb"模式)
pickle.dump(self.students, f) # 将 self.students 序列化为一个字节流,并将该字节流写入之前打开的文件中
# 加载文件数据
def load_students(self):
try:
with open("students.data", "rb") as f: # 以二进制读取模式("rb")打开students.data文件
return pickle.load(f) # 文件f中读取并反序列化对象,然后返回这个对象
except FileNotFoundError:
return {}
# 显示所有学生
def show_students(self):
if not self.students:
messagebox.showinfo("信息", "没有学生数据!")
return
message = "所有学生信息:\n"
for student_id, info in self.students.items(): # 遍历self.students字典
# 键(key)是学生的学号,值(value)是一个包含学生详细信息的字典,包括学生的姓名('name')和成绩('scores')
message += f"学号:{student_id}, 姓名:{info['name']}, 成绩:{info['scores']}\n" # 构建字符串 message,包含所有学生的学号、姓名和成绩信息
messagebox.showinfo("学生信息", message)
# 查询学生
def query_student(self):
student_id = simpledialog.askstring("输入", "请输入要查询的学号:", parent=self.root) # 简单对话框simpledialog,获取信息
if student_id in self.students:
info = self.students[student_id] # 从字典中获取该学生的详细信息(姓名和成绩)
messagebox.showinfo("学生信息", f"学号:{student_id}, 姓名:{info['name']}, 成绩:{info['scores']}")
else:
messagebox.showinfo("信息", "没有找到该学生!")
# 修改学生
def update_student(self):
student_id = simpledialog.askstring("输入", "请输入要修改的学号:", parent=self.root)
if student_id not in self.students:
messagebox.showinfo("信息", "没有找到该学生!")
return
# 示例:更新学生姓名
new_name = simpledialog.askstring("输入", "请输入新的姓名:", parent=self.root)
if new_name:
self.students[student_id]['name'] = new_name
scores = []
for i in range(9):
score_str = simpledialog.askfloat(f"成绩{i + 1}", f"请输入新的成绩{i + 1}:", parent=self.root) # 输入浮点数
if score_str is not None: # 如果取消askfloat 返回 None
scores.append(score_str)
# 更新学生成绩字典
self.students[student_id]['scores'] = scores
self.save_students() # 保存到文件
messagebox.showinfo("成功", "学生信息更新成功!")
# 删除学生
def delete_student(self):
student_id = simpledialog.askstring("输入", "请输入要删除的学号:", parent=self.root)
if student_id in self.students:
del self.students[student_id]
self.save_students()
messagebox.showinfo("成功", "学生删除成功!")
else:
messagebox.showinfo("信息", "没有找到该学生!")
if __name__ == "__main__":
root = tk.Tk()
app = GradeManagementSystem(root)
root.mainloop()
还有一版主页查看
标签:管理系统,python,GUI,id,students,student,学生,root,self From: https://blog.csdn.net/mingzinanqi_a/article/details/140375531