一篇文章用python GUI构建学生管理系统

引言

通过使用Python,我们可以利用其简洁和功能强大的特性,结合Tkinter提供的GUI开发能力,快速构建一个直观且易于使用的学生管理系统。

准备工作

在开始之前,确保你的开发环境中已经安装了

  1. Python
  2. Tkinter库

安装完成后,打开你的Python开发环境(IDE)或pycharm,我们将从头开始构建这个学生管理系统。

设计学生管理系统界面

我们的学生管理系统将包括以下主要组件:

  1. 姓名、年龄、课程输入框: 用于输入新学生的基本信息。
  2. 添加学生按钮: 将输入的学生信息添加到系统中。
  3. 显示学生按钮: 弹出窗口显示当前所有学生的信息。
  4. 编辑和删除学生按钮: 可以编辑和删除已有学生的信息。 
import tkinter as tk
from tkinter import messagebox

class StudentManagementSystem:
    def __init__(self, root):
        self.root = root
        self.root.title("学生管理系统")

        # 学生信息列表
        self.students = []

        # 创建界面元素
        self.label_name = tk.Label(root, text="姓名:")
        self.label_name.grid(row=0, column=0, padx=10, pady=10)
        self.entry_name = tk.Entry(root)
        self.entry_name.grid(row=0, column=1, padx=10, pady=10)

        self.label_age = tk.Label(root, text="年龄:")
        self.label_age.grid(row=1, column=0, padx=10, pady=10)
        self.entry_age = tk.Entry(root)
        self.entry_age.grid(row=1, column=1, padx=10, pady=10)

        self.label_course = tk.Label(root, text="课程:")
        self.label_course.grid(row=2, column=0, padx=10, pady=10)
        self.entry_course = tk.Entry(root)
        self.entry_course.grid(row=2, column=1, padx=10, pady=10)

        # 按钮:添加学生、显示学生、编辑学生、删除学生
        self.button_add = tk.Button(root, text="添加学生", command=self.add_student)
        self.button_add.grid(row=3, column=0, columnspan=2, padx=10, pady=10)

        self.button_show = tk.Button(root, text="显示学生", command=self.show_students)
        self.button_show.grid(row=4, column=0, columnspan=2, padx=10, pady=10)

        self.button_edit = tk.Button(root, text="编辑学生", command=self.edit_student)
        self.button_edit.grid(row=5, column=0, columnspan=2, padx=10, pady=10)

        self.button_delete = tk.Button(root, text="删除学生", command=self.delete_student)
        self.button_delete.grid(row=6, column=0, columnspan=2, padx=10, pady=10)

    def add_student(self):
        name = self.entry_name.get()
        age = self.entry_age.get()
        course = self.entry_course.get()

        if name and age and course:
            student = {"姓名": name, "年龄": age, "课程": course}
            self.students.append(student)
            self.save_students_to_file()  # 保存到文件
            messagebox.showinfo("成功", "学生信息已添加!")
            self.clear_entries()
        else:
            messagebox.showerror("错误", "请填写完整的学生信息!")

    def show_students(self):
        # 弹出窗口显示学生信息
        show_window = tk.Toplevel(self.root)
        show_window.title("学生信息")

        if not self.students:
            tk.Label(show_window, text="暂无学生信息").pack(padx=20, pady=20)
        else:
            for student in self.students:
                tk.Label(show_window, text=f"姓名: {student['姓名']}, 年龄: {student['年龄']}, 课程: {student['课程']}").pack(padx=20, pady=5)

    def edit_student(self):
        # 编辑学生信息
        name_to_edit = self.entry_name.get()
        found = False

        for student in self.students:
            if student['姓名'] == name_to_edit:
                student['年龄'] = self.entry_age.get()
                student['课程'] = self.entry_course.get()
                found = True
                self.save_students_to_file()  # 保存到文件
                messagebox.showinfo("成功", "学生信息已更新!")
                self.clear_entries()
                break
        
        if not found:
            messagebox.showerror("错误", "未找到该学生信息!")

    def delete_student(self):
        # 删除学生信息
        name_to_delete = self.entry_name.get()
        found = False

        for student in self.students:
            if student['姓名'] == name_to_delete:
                self.students.remove(student)
                found = True
                self.save_students_to_file()  # 保存到文件
                messagebox.showinfo("成功", "学生信息已删除!")
                self.clear_entries()
                break
        
        if not found:
            messagebox.showerror("错误", "未找到该学生信息!")

    def save_students_to_file(self):
        # 将学生信息保存到文件
        with open("students.txt", "w") as file:
            for student in self.students:
                file.write(f"{student['姓名']}, {student['年龄']}, {student['课程']}\n")

    def clear_entries(self):
        # 清空输入框内容
        self.entry_name.delete(0, tk.END)
        self.entry_age.delete(0, tk.END)
        self.entry_course.delete(0, tk.END)

if __name__ == "__main__":
    root = tk.Tk()
    app = StudentManagementSystem(root)
    root.mainloop()

运行结果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/769149.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQLServer:从数据类型 varchar 转换为 numeric 时出错。

1.工作要求 计算某两个经纬度距离 2.遇到问题 从数据类型 varchar 转换为 numeric 时出错。 3.解决问题 项目版本较老,使用SQLServer 2012 计算距离需执行视图,如下: SET QUOTED_IDENTIFIER ON SET ANSI_NULLS ON GO ALTER view vi_ord…

2024年迄今最热门的10款网络安全工具和产品

今年上半年,利用生成式人工智能(GenAI)的网络安全工具继续激增。许多供应商正在利用GenAI的功能来自动化安全运营中心(SOC)的工作,特别是在自动化日常活动方面,如收集威胁信息和自动创建查询。 …

Elasticsearch (1):ES基本概念和原理简单介绍

Elasticsearch(简称 ES)是一款基于 Apache Lucene 的分布式搜索和分析引擎。随着业务的发展,系统中的数据量不断增长,传统的关系型数据库在处理大量模糊查询时效率低下。因此,ES 作为一种高效、灵活和可扩展的全文检索…

Profibus DP主站转Modbus网关连接伺服与电机通讯

在工业自动化领域,将Profibus DP主站转Modbus网关(XD-MDPBM20)用于连接伺服与电机通讯是一种常见且重要的应用方式。当使用Profibus DP主站转Modbus网关(XD-MDPBM20)连接伺服与电机进行通讯时,可以参考以下…

强连通分量

强连通分量 强连通定义 有向图 G G G 的强连通是指 G G G 中任意两个节点都可以直接或间接到达。 下方两幅图都是强连通。一个特殊一点,任意两点都可以直接到达;一个则是最常见的强连通图。 特殊强连通图,任意两点都可以直接到达 常见的…

虚拟机启动失败 请进行修复 关闭hyper-v

场景 win11开启夜神模拟器时弹出此提示。点击关闭hyper-v并重启电脑后仍然不行。 解决方法 关闭 Windows安全中心 的 内存完整性 后重启电脑恢复正常。 补充 由于我这里除了会用到夜神模拟器,还会用到docker,而docker又依赖hyper-v,不…

YOLOv5初学者问题——用自己的模型预测图片不画框

如题,我在用自己的数据集训练权重模型的时候,在训练完成输出的yolov5-v5.0\runs\train\exp2目录下可以看到,在训练测试的时候是有输出描框的。 但是当我引用训练好的best.fangpt去进行预测的时候, 程序输出的图片并没有描框。根据…

【小白教学】-- 安装Ubuntu-20.04系统

下载 Ubuntu-20.04 镜像 具体如何下载镜像,请移驾我上一篇文章。使用清华大学开源镜像站下载。https://zhuanlan.zhihu.com/p/706444837 制作 Ubuntu-20.04 系统盘 安装软件 UltralSO 开始制作系统盘 第一步,插入一个 u 盘,启动软件&#x…

PO模式登录测试

项目实践 登陆项目测试 get_driver import page from selenium import webdriverclass GetDriver:driver Noneclassmethoddef get_driver(cls):if cls.driver is None:cls.driver webdriver.Edge()cls.driver.maximize_window()cls.driver.get(page.url)return cls.drivercl…

关于批量采集1688商品主图及链接的方式:软件采集/1688官方API接口数据采集

关于批量采集,我们通常用到的是软件 采集,或者通过1688官方API数据采集的形式:用户输入一组1688商品ID,一行一个,流程会自动逐个打开对应的1688商品详情页,采集主图的所有链接。 结果保存为表格的一行&…

Linux运维之管道符、重定向与环境变量

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 目录 一、输入输出重定向 二、管道命令符 三、命令行的通配符 四、常用的转义字符 五、重要的环境变量 致谢 一、输入输出重定向 输入重定向是…

【Python+微信小程序】学生考勤签到系统(已开源)

1. 简介 😝 这个项目是一款基于微信小程序和Flask框架开发的应用,旨在帮助学校管理学生的考勤和课程信息。系统通过集成数据库管理、API开发以及前后端交互,实现了便捷的学生考勤记录、课程表管理和教师交互功能。其主要特点包括&#xff1a…

程序化交易广告及其应用

什么是程序化交易广告? 程序化交易广告是以实时竞价技术即RTB(real-time bidding)为核心的广告交易方式。说到这里,你可能会有疑问:像百度搜索关键词广告还有百度网盟的广告,不也是CPC实时竞价的吗&#x…

Python学习笔记22:进阶篇(十一)常见标准库使用之访问互联网功能urllib模块的学习使用,requests库和aiohttp库了解

前言 本文是根据python官方教程中标准库模块的介绍,自己查询资料并整理,编写代码示例做出的学习笔记。 根据模块知识,一次讲解单个或者多个模块的内容。 教程链接:https://docs.python.org/zh-cn/3/tutorial/index.html 互联网访…

【基于R语言群体遗传学】-5-扩展到两个以上等位基因及多基因位点

我们现在继续对于群体遗传学进行统计建模,书接上回,我们讨论了孤雌生殖的物种违反哈代温伯格遗传比例的例子,那我们现在来看多于两个等位基因的情况的计算。 如果没有看过之前文章的同学,可以先去看一下之前的文章: …

1.2 ROS2安装

1.2.1 安装ROS2 整体而言,ROS2的安装步骤不算复杂,大致步骤如下: 准备1:设置语言环境;准备2:启动Ubuntu universe存储库;设置软件源;安装ROS2;配置环境。 请注意&…

多模态图像生成的突破:Image Anything一种无需训练的智能框架

多模态图像生成是内容创作领域的热点技术,尤其在媒体、艺术和元宇宙等领域。该技术旨在模拟人类的想象力,将视觉、文本和音频等多种模态属性相关联,以生成图像。早期的方法主要侧重于单一模态输入的图像生成,例如基于图像、文本或…

240703_昇思学习打卡-Day15-K近邻算法实现红酒聚类

KNN(K近邻)算法实现红酒聚类 K近邻算法,是有监督学习中的分类算法,可以用于分类和回归,本篇主要讲解其在分类上的用途。 文章目录 KNN(K近邻)算法实现红酒聚类算法原理数据下载数据读取与处理模型构建--计算距离模型预测 算法原理 KNN算法虽…

Mac单机游戏推荐:星际争霸母巢之战 for Mac v1.16.1汉化版

星际争霸母巢之战 for Mac是一款深受玩家的即时战略游戏,延续了原版《星际争霸》的剧情,并加入了新的游戏单位、科技、地图样式、背景音乐及平衡性调整。《星际争霸》与其它的即时战略类型游戏。 下载地址:点击下载 与原作相同,《…

一图胜千言|用Python搞定统计结果展示!

分享一份原创Python可视化教程:530张图形8000行代码,轻松搞定统计结果展示,部分如下, 每类图表包含详细代码详细代码注释,多达8000行代码,例如, 如何加入学习? 👇&#…