首页 > 编程语言 >基于python的学生成绩管理系统(GUI)

基于python的学生成绩管理系统(GUI)

时间:2024-07-13 20:57:48浏览次数:19  
标签:管理系统 python GUI id students student 学生 root self

 利用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

相关文章

  • abaqus基于python二次开发——钢结构穹顶建模
    模型示意本工作旨在建立一个上表面近乎球面的钢结构穹顶。如下图所示,该穹顶由环向梁和径向梁组成。环向梁径向梁上下截面都为工字钢。环向梁截面如下图所示,环向梁截面有一个倾斜角度,为了使其上表面尽可能与球面贴合。径向梁横截面为不经过旋转的工字形代码讲解 2......
  • 使用 pip 和 requirements.txt 安装 Python 包
    1.构建当前项目需要的软件包pip3installpipreqspip3installpip-toolspipreqs--savepath=requirements.in&&pip-compile1.根据配置文件批量安装软件包。requirements.txt在某些环境中,可使用pip3而不是pippipinstall-rrequirements.txt2.检查当前环境......
  • python——数据类型及常用操作
    1.Intint是一种基本的数据类型,可以存储任意大小的整数,定义简单,将一个值赋给变量即可可以和+-*/等运算符结合a=2b=3c=a+bprint(c)d=b-apint(d)e=a*bprint(e)fa/bprint(f)a=2print(a)2.Floatfloat表示浮点数 也就是我们常说的带有小数......
  • python进程和线程_day013
    python进程和线程概念相关进程概览线程概览Python中的多进程Python中的多线程多进程还是多线程单线程+异步I/O(协程)应用案例示例1:将耗时间的任务放到线程中以获得更好的用户体验示例2:使用多进程对复杂任务进行“分而治之”。今天我们使用的计算机早已进入多CPU或多核......
  • springboot+vue+mybatis文化遗产管理系统+PPT+论文+讲解+售后
    信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多......
  • 基于SpringBoot的校园志愿者管理系统
    你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。开发语言:Java数据库:MySQL技术:SpringBoot框架工具:MyEclipse、Tomcat系统展示首页个人中心志愿者管理活动信息管理摘要随着信息化时代的到来,管理系统趋向于智能化、系统化。校园志愿者管理系统的......
  • 使用python绘制3D柱状图+完整代码展示
    一、首先进行代码效果图的展示        这是一个简单的3D模型图的展示,我们可以从官网上看到有类似的模型代码,但是大部分都没有加上全局系统配置,整体效果很单一,看不出来有什么特色,我们可以通过了解我们的python绘图工具pyecharts库。二、了解代码这个就是我们的全局......
  • python数据可视化(5)——绘制饼图
    课程学习来源:b站up:【蚂蚁学python】【课程链接:【【数据可视化】Python数据图表可视化入门到实战】】【课程资料链接:【链接】】Python绘制饼图分析北京天气饼图,是一个划分为几个扇形的圆形统计图表,能够直接以图形的方式直接显示各个组成部分所占比例目的:查看2019年北京......
  • Python数据容器(dict字典、set集合)
    dic字典dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。字典的创建使用大括号{}包含键值对,并用冒号:分隔键和值,形成键:值对。字典的特性唯一键:字典中的每个键都必须是唯一的。值可以取任何数据类型,如字符串,数字,元组。无序(Python......
  • Python 潮流周刊#60:Python 的包管理工具真是多啊(摘要)
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。本期周刊分享了13篇文章,13个开源项目,全文2300字。重要提醒:1、本专栏的......