【Python毕业设计】Python基于面向对象+tkinter打造学生信息管理系统 | 附源码

news2024/11/15 17:21:56

前言

halo,包子们上午好
很多学计算机的小伙伴应该都知道,毕业设计是一个头疼的东西
今天的话小编这边给大家准备好了一个Python基于面向对象+tkinter打造学生信息管理系统
这不是毕业设计必备项目
说实话操作起来还是有那么一点点的难度的,但是大家不用担心
作为一个宠粉狂魔的小编,肯定都给大家准备好了的
直接上才艺

相关文件

关注小编,私信小编领取哟!
当然别忘了一件三连哟~~
公众号:Python日志

源码点击蓝色字体领取
Python零基础入门到精通视频合集

【整整800集】Python爬虫项目零基础入门合集,细狗都学会了,你还不会?

开发工具

Python版本:3.7.8
相关模块:
tkinter模块;
json模块;
以及一些python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

效果展示

账号登录

在这里插入图片描述

录入界面

在这里插入图片描述

查询界面

在这里插入图片描述

删除界面

在这里插入图片描述
删除成功
在这里插入图片描述
在这里插入图片描述

修改界面

在这里插入图片描述
修改成功

在这里插入图片描述
在这里插入图片描述

代码实现

运行界面

import tkinter as tk
from LoginPage import *

root = tk.Tk()
root.title('学生管理系统 公众号:Python日志 源码领取QQ群:494958217')
LoginPage(root)
# MainPage(root)
root.mainloop()

布局

class LoginPage(object):
    def __init__(self, master=None):
        # master 画板对象,往画板上作画
        self.root = master  # 定义内部变量root
        self.root.geometry('%dx%d' % (300, 180))  # 设置窗口大小

        # 定义可以在页面更新数据的变量 普通字符串改变之后无法及时在页面中刷新
        self.username = tk.StringVar()
        self.password = tk.StringVar()

        # 画 内容 需要画在纸上面
        # 创建新的 布局控件 找一张新的纸作画
        self.page = tk.Frame(self.root)  # 创建Frame
        # 将控件布局到 root 对象 (GUI 程序对象)
        self.page.pack()

        self.create_page()

    def create_page(self):
        """
            使用表格布局绘制内容

        """
        #
        # tk.Label 文本框 显示文字内容
        # stick 控件对象方向 tk.W 西方位
        # pady padding y 上下的宽度
        # row 行 表格布局
        tk.Label(self.page).grid(row=0, stick=tk.W)
        tk.Label(self.page, text='账户: ').grid(row=1, stick=tk.W, pady=10)
        # tk.Label 输入框 显示输入内容
        # 输入框的文字等内容需要更新
        tk.Entry(self.page, textvariable=self.username).grid(row=1, column=1, stick=tk.E)
        tk.Label(self.page, text='密码: ').grid(row=2, stick=tk.W, pady=10)
        tk.Entry(self.page, textvariable=self.password, show='*').grid(row=2, column=1, stick=tk.E)
        tk.Button(self.page, text='登陆', command=self.login_check).grid(row=3, stick=tk.W, pady=10)
        tk.Button(self.page, text='退出', command=self.page.quit).grid(row=3, column=1, stick=tk.E)

账号密码设置

 def login_check(self):
        """登录检测"""
        name = self.username.get()
        secret = self.password.get()
        if name == '徐大兄弟' and secret == '123456':
            self.page.destroy()
            MainPage(self.root)
        else:
            tkinter.messagebox.showinfo(title='错误', message='账号或密码错误!')

学生信息管理系统数据模型

import json


class StudentsDB:
    """学生信息管理系统数据模型"""

    def __init__(self):
        self.students = []
        # 加载本地文件中的数据
        self._load_students_data()

    def insert(self, student):
        """将学生数据插入到列表"""
        self.students.append(student)

    def all(self):
        """返回所有的学生数据"""
        return self.students

    def delete_by_name(self, name):
        """根据名字获取学生数据,如果没有就返回 False"""
        for student in self.students:
            if name == student['name']:
                self.students.remove(student)
                break
        else:
            return False
        return True

    def search_by_name(self, name):
        """根据名字查询学员,没有找到就返回 False"""
        for student in self.students:
            if name == student['name']:
                return student
        else:
            return False

    def update(self, stu):
        """更新学员信息"""
        name = stu['name']
        for student in self.students:
            if name == student['name']:
                student.update(stu)
                return True
        else:
            return False

    def _load_students_data(self):
        """从本地文件中加载数据"""
        with open('students.json', mode='r', encoding='utf-8') as f:
            text = f.read()
        if text:
            self.students = json.loads(text)

    def save_data(self):
        """保存数据到本地文件"""
        with open('students.json', mode='w', encoding='utf-8') as f:
            text = json.dumps(self.students, ensure_ascii=False)
            f.write(text)


db = StudentsDB()

菜单设置

import tkinter as tk
from view import *  # 菜单栏对应的各个子页面


class MainPage(object):
    def __init__(self, master=None):
        self.root = master  # 定义内部变量root
        self.root.geometry('%dx%d' % (600, 400))  # 设置窗口大小

        self.create_page()

    def create_page(self):
        menubar = tk.Menu(self.root)
        # menubar.add_command(label='录入')
        # menubar.add_command(label='查询')
        # menubar.add_command(label='删除')
        # menubar.add_command(label='修改')
        # menubar.add_command(label='关于')

        self.input_page = InputFrame(self.root)  # 创建不同 Frame
        self.query_page = QueryFrame(self.root)
        self.delete_page = DeleteFrame(self.root)
        self.change_page = ChangeFrame(self.root)
        self.about_page = AboutFrame(self.root)
        self.input_page.pack()  # 默认显示数据录入界面

        # 控件只是显示,如果需要实现切换的逻辑需要用代码实现
        menubar.add_command(label='录入', command=self.input_data)
        menubar.add_command(label='查询', command=self.query_data)
        menubar.add_command(label='删除', command=self.delete_data)
        menubar.add_command(label='修改', command=self.change_data)
        menubar.add_command(label='关于', command=self.about_disc)
        self.root['menu'] = menubar  # 设置菜单栏

    def input_data(self):
        self.input_page.pack()
        self.query_page.pack_forget()
        self.delete_page.pack_forget()
        self.change_page.pack_forget()
        self.about_page.pack_forget()

    def query_data(self):
        self.input_page.pack_forget()
        self.query_page.pack(fill=tk.X, expand=True, padx=10, pady=10, anchor=tk.N)
        self.delete_page.pack_forget()
        self.change_page.pack_forget()
        self.about_page.pack_forget()

    def delete_data(self):
        self.input_page.pack_forget()
        self.query_page.pack_forget()
        self.delete_page.pack()
        self.change_page.pack_forget()
        self.about_page.pack_forget()

    def change_data(self):
        self.input_page.pack_forget()
        self.query_page.pack_forget()
        self.delete_page.pack_forget()
        self.change_page.pack()
        self.about_page.pack_forget()

    def about_disc(self):
        self.input_page.pack_forget()
        self.query_page.pack_forget()
        self.delete_page.pack_forget()
        self.change_page.pack_forget()
        self.about_page.pack()

    def __del__(self):
        db.save_data()


if __name__ == '__main__':
    root = tk.Tk()
    MainPage(root)
    root.mainloop()

录入数据

 class InputFrame(tk.Frame):  # 继承Frame类
    def __init__(self, master=None):
        super().__init__(master)
        self.root = master  # 定义内部变量root
        self.name = tk.StringVar()
        self.math = tk.StringVar()
        self.chinese = tk.StringVar()
        self.english = tk.StringVar()
        self.status = tk.StringVar()
        self.create_page()

    def create_page(self):
        # stick 控件对象方向 tk.W 西方位
        # pady padding y 上下的宽度
        # row 行 表格布局
        tk.Label(self).grid(row=0, stick=tk.W, pady=10)
        tk.Label(self, text='姓 名: ').grid(row=1, stick=tk.W, pady=10)
        # text variable 绑定控件里面的数据内容
        tk.Entry(self, textvariable=self.name).grid(row=1, column=1, stick=tk.E)
        tk.Label(self, text='数 学: ').grid(row=2, stick=tk.W, pady=10)
        tk.Entry(self, textvariable=self.math).grid(row=2, column=1, stick=tk.E)
        tk.Label(self, text='语 文: ').grid(row=3, stick=tk.W, pady=10)
        tk.Entry(self, textvariable=self.chinese).grid(row=3, column=1, stick=tk.E)
        tk.Label(self, text='英 语: ').grid(row=4, stick=tk.W, pady=10)
        tk.Entry(self, textvariable=self.english).grid(row=4, column=1, stick=tk.E)
        tk.Button(self, text='录入', command=self.recode_student).grid(row=5, column=1, stick=tk.E, pady=10)
        tk.Label(self, textvariable=self.status).grid(row=6, column=1, stick=tk.E, pady=10)

    def recode_student(self):
        student = {
            'name': self.name.get(),
            'math': self.math.get(),
            'chinese': self.chinese.get(),
            'english': self.english.get(),
        }
        db.insert(student)
        self.status.set('插入数据成功')
        self._clear_avr()

    def _clear_avr(self):
        self.name.set("")
        self.math.set("")
        self.chinese.set("")
        self.english.set("")

查询数据

class QueryFrame(tk.Frame):  # 继承Frame类
    def __init__(self, master=None):
        super().__init__(master)
        self.root = master  # 定义内部变量root
        self.itemName = tk.StringVar()

        self.table_frame = tk.Frame(self)
        self.table_frame.pack()
        self.row = 1

        self.create_page()

    def create_page(self):
        self.create_tree_view()
        self.show_data_frame()
        tk.Button(self, text='刷新数据', command=self.show_data_frame).pack(anchor=tk.E, pady=5)

    def show_data_frame(self):
        # 删除原节点
        for _ in map(self.tree_view.delete, self.tree_view.get_children("")):
            pass
        students = db.all()
        for index, stu in enumerate(students):
            print(stu)
            self.tree_view.insert('', index + 1,
                                  values=(stu['name'], str(stu['chinese']), str(stu['math']), str(stu['english'])))

    def create_tree_view(self):
        # 表格
        columns = ("name", "chinese", "math", "english")
        columns_value = ('姓名', '语文', '数学', '英语')
        self.tree_view = ttk.Treeview(self, show="headings", columns=columns)
        self.tree_view.column('name', width=80, anchor='center')
        self.tree_view.column('chinese', width=80, anchor='center')
        self.tree_view.column('math', width=80, anchor='center')
        self.tree_view.column('english', width=80, anchor='center')
        self.tree_view.heading('name', text='姓名')
        self.tree_view.heading('chinese', text='语文')
        self.tree_view.heading('math', text='数学')
        self.tree_view.heading('english', text='英语')
        self.tree_view.pack(fill=tk.BOTH, expand=True)

删除数据

class DeleteFrame(tk.Frame):  # 继承Frame类
    def __init__(self, master=None):
        super().__init__(master)
        self.root = master  # 定义内部变量root
        tk.Label(self, text='删除数据').pack()
        self.delete_frame = tk.Frame(self)
        self.delete_frame.pack()
        self.status = tk.StringVar()
        self.v1 = tk.StringVar()
        self.create_page()

    def create_page(self):
        tk.Label(self.delete_frame, text='根据名字删除信息').pack(anchor=tk.W, padx=20)
        e1 = tk.Entry(self.delete_frame, textvariable=self.v1)
        e1.pack(side=tk.LEFT, padx=20, pady=5)

        tk.Button(self.delete_frame, text='删除', command=self._delete).pack()
        tk.Label(self, textvariable=self.status).pack()

    def _delete(self):
        name = self.v1.get()
        print(name)
        r = db.delete_by_name(name)
        if r:
            self.status.set(f'{name} 已经被删除')
            self.v1.set("")
        else:
            self.status.set(f'{name} 不存在')

修改数据

class ChangeFrame(tk.Frame):  # 继承Frame类
    def __init__(self, master=None):
        super().__init__(master)
        self.root = master  # 定义内部变量root

        tk.Label(self, text='修改界面').pack()
        self.change_frame = tk.Frame(self)
        self.change_frame.pack()
        self.status = tk.StringVar()
        self.name = tk.StringVar()
        self.math = tk.StringVar()
        self.chinese = tk.StringVar()
        self.english = tk.StringVar()

        self.create_page()

    def create_page(self):
        tk.Label(self.change_frame).grid(row=0, stick=tk.W, pady=1)
        tk.Label(self.change_frame, text='姓 名: ').grid(row=1, stick=tk.W, pady=10)
        tk.Entry(self.change_frame, textvariable=self.name).grid(row=1, column=1, stick=tk.E)
        tk.Label(self.change_frame, text='数 学: ').grid(row=2, stick=tk.W, pady=10)
        tk.Entry(self.change_frame, textvariable=self.math).grid(row=2, column=1, stick=tk.E)
        tk.Label(self.change_frame, text='语 文: ').grid(row=3, stick=tk.W, pady=10)
        tk.Entry(self.change_frame, textvariable=self.chinese).grid(row=3, column=1, stick=tk.E)
        tk.Label(self.change_frame, text='英 语: ').grid(row=4, stick=tk.W, pady=10)
        tk.Entry(self.change_frame, textvariable=self.english).grid(row=4, column=1, stick=tk.E)
        tk.Button(self.change_frame, text='查询', command=self._search).grid(row=6, column=0, stick=tk.W, pady=10)
        tk.Button(self.change_frame, text='修改', command=self._change).grid(row=6, column=1, stick=tk.E, pady=10)
        tk.Label(self.change_frame, textvariable=self.status).grid(row=7, column=1, stick=tk.E, pady=10)

    def _search(self):
        name = self.name.get()
        student = db.search_by_name(name)
        if student:
            self.math.set(student['math'])
            self.chinese.set(student['chinese'])
            self.english.set(student['english'])
            self.status.set(f'查询到 {name} 同学的信息')
        else:
            self.status.set(f'没有 {name} 同学的信息')

    def _change(self):
        name = self.name.get()
        math = self.math.get()
        chinese = self.chinese.get()
        english = self.english.get()
        stu = {
            'name': name,
            'math': math,
            'chinese': chinese,
            'english': english,
        }
        r = db.update(stu)
        if r:
            self.status.set(f'{name} 同学的信息更新完毕')
        else:
            self.status.set(f'{name} 同学的信息更新失败')

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年天津医科大学临床医学院专升本专业课考试报名缴费考试安排

天津医科大学临床医学院2023年高职升本科专业课考试报考须知 一、报名条件: 报考2023年天津医科大学临床医学院高职升本科专业课考试的考生应符合以下条件: 1、符合《2023年天津市高职升本科招生工作规定》中规定的报考资格。 2、我院高职升本科专业课考…

scViewerX ActiveX 多功能文件查看器控件

scViewerX ActiveX 控件 scViewerX是一个功能强大的 ActiveX 控件,允许您查看、打印和转换 PLT、Adobe PDF、Autodesk DWF、CGM、Calcomp、HPGL/2、Gerber、TIF、CALS 和其他几种格式。 ScViewerX 可以将您的文件转换为多种不同的输出文件格式,包括 PDF、…

软件测试题库怎么样 这个刷题小程序很适合临时抱佛脚

考试刷题,面试找工作也要刷题?说到这,可能很多都觉得不可思议,这找工作,还得提前刷题做准备?其实这个现象一个都有的,尤其是对于技术岗来说,由于面试官会着重询问技术相关问题&#…

结合邻域连接法的蚁群优化(NACO)求解TSP问题附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

(附源码)node.js学生钟点工管理系统 毕业设计 290011

学生钟点工管理系统 摘 要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,学生钟点工管理系统当然也不能排除在外。学生钟点工管理系统是以实际运用为开发背景,运用…

docker(2):docker常用命令

目录帮助命令镜像命令docker imagesdocker searchdocker pulldocker rmi容器命令docker rundocker psdocker rm启动/停止/退出其他常用命令后台启动docker logsdocker topdocker inspectdocker execDocker attachdocker cp命令大全总结所有命令请查看帮助文档:https…

[附源码]Python计算机毕业设计SSM基于售楼系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Span 抽取和元学习能碰撞出怎样的新火花,小样本实体识别来告诉你!

作者:王嘉宁、汪诚愚、谭传奇、邱明辉、黄松芳、黄俊、高明 近日,阿里云机器学习平台PAI与华东师范大学高明教授团队、达摩院机器智能技术NLP团队合作在自然语言处理顶级会议EMNLP2022上发表基于Span和元学习的小样本实体识别算法SpanProto。这是一种面…

界面控件DevExtreme DataGrid——一个多用途的UI组件

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NET Core,jQuery,Knockout等)构建交互式的Web应用程序,该套件附带功能齐…

【视频】什么是非线性模型与R语言多项式回归、局部平滑样条、 广义相加GAM分析工资数据|数据分享...

全文链接:http://tecdat.cn/?p9706在这文中,我将介绍非线性回归的基础知识。非线性回归是一种对因变量和一组自变量之间的非线性关系进行建模的方法。最后我们用R语言非线性模型预测个人工资数据(查看文末了解数据获取方式)是否每…

《人月神话》(The Mythical Man-Month)看清问题的本质:如果我们想解决问题,就必须试图先去理解它...

第一章 焦油坑(The Tar Pit)史前史中,没有比巨兽在焦油坑中垂死挣扎的场面更令人震撼的了。上帝见证着恐龙、猛犸象、剑齿虎在焦油中挣扎。它们挣扎得越是猛烈,焦油纠缠得越紧,没有任何猛兽足够强壮或具有足够的技巧&a…

Linux简化版线程池

目录 一,线程池设计 二,线程池应用场景 三,线程池准备 1,包装一个锁 2,一个任务类 三,线程池 1,成员介绍 2,设计单例模式 3,创建线程池 4,线程池执…

【吴恩达机器学习笔记】十六、应用实例:图片文字识别

✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📣专栏定位:为学习吴恩达机器学习视频的同学提供的随堂笔记。 📚专栏简介:在这个专栏,我将整理吴恩达机器学习视频的所有内容的笔记&…

【Linux】Zabbix5.0平台的搭建

文章目录项目背景视频展演一、Linux基础配置1、查看当前系统版本2、修改主机名3、修改 IP 地址4、配置防火墙5、关闭 SELINUX6、修改系统时间及时区7、配置 YUM 库方式 1方式 2二、安装apache1、安装 apache2、启动 apache 服务3、设置 httpd 服务开机启动4、查看服务状态5、防…

深度学习——制作自己的VOC图像分割数据集

1、数据集介绍 COCO数据集有80个类别,VOC数据集有20个类别。当这些数据集类别中没有自己需要的时候,就需要自己动手做自己的数据集了。 我自己在做数据集的时候主要使用到了labelme和labelImg两个工具。labelme主要是制作语义分割数据集(ImageSets,JPEGImages,SegmentationC…

kubernetes 1.18 部署 ingress-nginx

文章目录kubernetes 1.18 部署 ingress-nginx1. 下载 yaml 文件2. 安装 ingress-nginx3. 检查安装情况4. 测试验证4.1 查看ingress规则4.2 访问测试5. 其他内容kubernetes 1.18 部署 ingress-nginx 1. 下载 yaml 文件 在 GitHub 下载完成之后可以直接使用,不需要修…

[基因遗传算法]进阶之三:sko.GA的实践TSP

参考资料:《VRP问题分类》 相关文章: 《[基因遗传算法]原理思想和python代码的结合理解之(一) :单变量》 《[基因遗传算法]进阶之二:最优规划问题–多种编码方式多变量》 文章目录一. GA的用法1.1 help(sko.GA)1.2 目标函数的书写A. 单变量的书写B. 多变量的书写C. 变量的范围…

mysql中的B+树、索引跳跃扫描

普通索引 B树的叶子节点上记录的是聚簇索引(主键索引)的值。 联合索引 叶子节点中记录的是name,age两个字段以及主键id的值。 MySQL一定是遵循最左前缀匹配的,这句话在mysql8以前是正确的,没有任何毛病。但是在M…

(文章复现)7.计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度(MATLAB程序)

联系方式:2645521500 复现文章: 计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度——孙惠娟(电网技术—2020) 摘要: 为了促进多能源互补及能源低碳化,本文提出了计及电转气协同的含碳捕集与垃圾焚…

有手就会做,保姆级Jmeter分布式压测操作流程(图文并茂)

分布式压测原理 分布式压测操作 保证本机和执行机的JDK和Jmeter版本一致 配置Jmeter环境变量 配置Jmeter配置文件 上传每个执行机服务jmeter chmod -R 755 apache-jmeter-5.1.1/ 执行机配置写自己的ip 控制机配置所有执行机ip,把server.rmi.ssl.disable改成true 将本机也作…