python超详细实现完整学生成绩管理系统


Posted in Python onMarch 17, 2022

学生成绩管理系统简介

一个带有登录界面具有增减改查功能的学生成绩管理系统(面向对象思想,利用tkinter库进行制作,利用.txt文件进行存储数据)

python超详细实现完整学生成绩管理系统

python超详细实现完整学生成绩管理系统

python超详细实现完整学生成绩管理系统

python超详细实现完整学生成绩管理系统

python超详细实现完整学生成绩管理系统

python超详细实现完整学生成绩管理系统

源代码

✅仅供学习参考,最好还是自己多敲多练习(实践是检验真理的唯一标准)

students.txt

用于存储数据

main.py

from tkinter import *
from Login import *
import tkinter as tk

root = tk.Tk()
root.title('欢迎进入学生成绩管理系统')
LoginPage(root)
root.mainloop()

Login.py

from tkinter import *
from tkinter.messagebox import *
from MenuPage import *


class LoginPage(object):
    def __init__(self, master=None):
        self.root = master  # 定义内部变量root
        self.root.geometry('%dx%d' % (300, 180))  # 设置窗口大小
        self.username = StringVar()
        self.password = StringVar()
        self.createPage()

    def createPage(self):
        self.page = Frame(self.root)  # 创建Frame
        self.page.pack()
        Label(self.page).grid(row=0, stick=W)
        Label(self.page, text='账户: ').grid(row=1, stick=W, pady=10)
        Entry(self.page, textvariable=self.username).grid(row=1, column=1, stick=E)
        Label(self.page, text='密码: ').grid(row=2, stick=W, pady=10)
        Entry(self.page, textvariable=self.password, show='*').grid(row=2, column=1, stick=E)
        Button(self.page, text='登陆', command=self.loginCheck).grid(row=3, stick=W, pady=10)
        Button(self.page, text='退出', command=self.page.quit).grid(row=3, column=1, stick=E)

    def loginCheck(self):
        name = self.username.get()
        password = self.password.get()
        if name == 'hacker707' and password == 'admin':
            self.page.destroy()
            MenuPage(self.root)
        else:
            showinfo(title='错误', message='账号或密码错误!')

db.py

import json


class StudentDB(object):
    def __init__(self):
        self.students = []
        self._load_students_data()

    def insert(self, student):
        self.students.append(student)
        print(self.students)

    def all(self):
        return self.students

    def delete_by_name(self, name):  # 删除数据
        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):
        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.txt", "r", encoding="utf-8") as f:
            text = f.read()
        if text:
            self.students = json.loads(text)

    # 保存数据
    def save_data(self):
        with open("students.txt", 'w', encoding="utf-8") as f:
            text = json.dumps(self.students, ensure_ascii=False)
            f.write(text)


db = StudentDB()

MenuPage.py

import tkinter as tk
from view import *


class MenuPage(object):
    def __init__(self, master=None):
        self.root = master
        self.root.geometry('%dx%d' % (600, 400))
        self.create_page()
        self.input_page = InputFrame(self.root)
        self.query_page = QuerryFrame(self.root)
        self.delete_page = DeleteFrame(self.root)
        self.update_page = UpdateFrame(self.root)
        self.about_page = AboutFrame(self.root)
        self.input_page.pack()

    def create_page(self):
        # 创建菜单对象
        menubar = tk.Menu(self.root)
        # add_command 添加
        menubar.add_command(label="录入", command=self.input_data)  # label
        menubar.add_command(label="查询", command=self.query_data)  # label
        menubar.add_command(label="删除", command=self.delete_data)  # label
        menubar.add_command(label="修改", command=self.update_data)  # label
        menubar.add_command(label="关于", command=self.about_data)  # label
        # 设置菜单栏
        self.root.config(menu=menubar)

    # 切换界面
    def input_data(self):
        self.input_page.pack()
        self.update_page.pack_forget()
        self.delete_page.pack_forget()
        self.about_page.pack_forget()
        self.query_page.pack_forget()

    def query_data(self):
        self.input_page.pack_forget()
        self.query_page.pack()
        self.update_page.pack_forget()
        self.delete_page.pack_forget()
        self.about_page.pack_forget()

    def update_data(self):
        self.input_page.pack_forget()
        self.update_page.pack()
        self.delete_page.pack_forget()
        self.about_page.pack_forget()
        self.query_page.pack_forget()

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

    def about_data(self):
        self.input_page.pack_forget()
        self.update_page.pack_forget()
        self.delete_page.pack_forget()
        self.about_page.pack()
        self.query_page.pack_forget()

view.py

import tkinter as tk
from db import db
from tkinter import ttk


# 录入类
class InputFrame(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.root = master
        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):
        tk.Label(self).grid(row=0, stick=tk.W, pady=10)
        tk.Label(self, text="姓名:").grid(row=1, stick=tk.W, pady=10)
        # 单行文本框 entry,textvariable绑定变量
        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)
        # 单行文本框 entry,textvariable绑定变量
        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)
        # 单行文本框 entry,textvariable绑定变量
        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)
        # 单行文本框 entry,textvariable绑定变量
        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)
        # get()得到值
        # set()设置值
        self.status.set("插入数据成功!")
        self._clear_data()
        db.save_data()

    # 清空文本数据
    def _clear_data(self):
        self.name.set("")
        self.math.set("")
        self.chinese.set("")
        self.english.set("")


# 查询类
class QuerryFrame(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.root = master
        self.create_page()

    # 创建查询界面
    def create_page(self):
        self.create_tree_view()
        self.show_data_frame()
        # grid()
        tk.Button(self, text="刷新数据", command=self.show_data_frame).pack(anchor=tk.E, pady=5)

    # Treeview
    def create_tree_view(self):
        # 表头
        columns = ("name", "chinese", "math", "english")
        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()

    # 显示数据
    def show_data_frame(self):
        # 删除原节点 map(int,值)
        for i in map(self.tree_view.delete, self.tree_view.get_children("")):
            pass
        # 拿到列表里面所有值、students[]
        students = db.all()
        # 同时拿到索引跟value值
        for index, stu in enumerate(students):
            self.tree_view.insert('', index, values=(stu["name"], stu["chinese"], stu
            ["math"], stu["english"]))


class DeleteFrame(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        tk.Label(self, text='删除数据').pack()
        self.status = tk.StringVar()
        self.de_name = tk.StringVar()  # 获取删除学生的姓名
        self.create_page()

    # 创建界面
    def create_page(self):
        tk.Label(self, text="根据姓名删除信息").pack(anchor=tk.W, padx=20)
        e1 = tk.Entry(self, textvariable=self.de_name)
        e1.pack(side=tk.LEFT, padx=20, pady=5)

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

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


class UpdateFrame(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.root = master
        tk.Label(self, text='修改界面').pack()
        self.change_frame = tk.Frame(self)
        self.change_frame.pack()
        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):
        tk.Label(self.change_frame).grid(row=0, stick=tk.W, pady=10)
        tk.Label(self.change_frame, text="姓名:").grid(row=1, stick=tk.W, pady=10)
        # 单行文本框 entry,textvariable绑定变量
        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)
        # 单行文本框 entry,textvariable绑定变量
        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)
        # 单行文本框 entry,textvariable绑定变量
        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)
        # 单行文本框 entry,textvariable绑定变量
        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}同学的信息更新失败")


class AboutFrame(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.root = master
        self.create_page()

    def create_page(self):
        tk.Label(self, text="关于本作品(人生苦短,我用python)").pack(anchor=tk.W)

?以上就是使用python实现学生成绩管理系统,如果有改进的建议,欢迎在评论区留言奥~

这篇文章参加了csdn的活动,还请大家多多三连支持一下博主,你们的支持就是我创作的动力?

到此这篇关于python超详细实现完整学生成绩管理系统的文章就介绍到这了,更多相关python 学生成绩管理系统内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python学习手册中的python多态示例代码
Jan 21 Python
在Python的web框架中中编写日志列表的教程
Apr 30 Python
Python中的字符串替换操作示例
Jun 27 Python
Python正则表达式知识汇总
Sep 22 Python
Pandas标记删除重复记录的方法
Apr 08 Python
Python中实例化class的执行顺序示例详解
Oct 14 Python
不到40行代码用Python实现一个简单的推荐系统
May 10 Python
python登录WeChat 实现自动回复实例详解
May 28 Python
python操作kafka实践的示例代码
Jun 19 Python
python tkinter实现彩球碰撞屏保
Jul 30 Python
pytorch的梯度计算以及backward方法详解
Jan 10 Python
Tensorflow训练模型越来越慢的2种解决方案
Feb 07 Python
Python Pygame实战之塔防游戏的实现
pytorch中的 .view()函数的用法介绍
Mar 17 #Python
Python绘画好看的星空图
opencv深入浅出了解机器学习和深度学习
Python与C++中梯度方向直方图的实现
JAVA SpringMVC实现自定义拦截器
Mar 16 #Python
Python Pandas 删除列操作
Mar 16 #Python
You might like
PHP实现加密的几种方式介绍
2015/02/22 PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
2015/12/08 PHP
PHP判断是否是微信打开还是浏览器打开的方法
2019/02/27 PHP
asp.net和php的区别点总结
2019/10/10 PHP
初学js插入节点appendChild insertBefore使用方法
2011/07/04 Javascript
自己动手开发jQuery插件教程
2011/08/25 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
2014/02/12 Javascript
jquery插件开发之实现google+圈子选择功能
2014/03/10 Javascript
JS获取图片高度宽度的方法分享
2015/04/17 Javascript
招聘网站基于jQuery实现自动刷新简历
2015/05/10 Javascript
Jquery-1.9.1源码分析系列(十一)之DOM操作
2015/11/25 Javascript
Bootstrap3制作图片轮播效果
2016/05/12 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
基于ES6作用域和解构赋值详解
2017/11/03 Javascript
浅谈redux以及react-redux简单实现
2018/08/28 Javascript
Vue项目自动转换 px 为 rem的实现方法
2018/10/29 Javascript
详解vue后台系统登录态管理
2019/04/02 Javascript
JavaScript中的相等操作符使用详解
2019/12/21 Javascript
JavaScript写个贪吃蛇小游戏(超详细)
2020/03/17 Javascript
python简单实现基数排序算法
2015/05/16 Python
django admin添加数据自动记录user到表中的实现方法
2018/01/05 Python
Python 3.6 读取并操作文件内容的实例
2018/04/23 Python
实例讲解Python3中abs()函数
2019/02/19 Python
python的schedule定时任务模块二次封装方法
2019/02/19 Python
HTML5 文件域+FileReader 分段读取文件并上传到服务器
2017/10/23 HTML / CSS
世界上最悠久的自行车制造商:Ribble Cycles
2017/03/18 全球购物
SHEIN香港:价格实惠的女性时尚服装
2018/08/14 全球购物
HomeAway澳大利亚:预订你的度假屋,公寓、度假村、别墅等
2019/02/20 全球购物
DeinDesign德国:设计自己的手机壳
2019/12/14 全球购物
党校自我鉴定范文
2013/10/02 职场文书
会计系个人求职信范文分享
2013/12/20 职场文书
专业技术职务聘任书
2014/03/29 职场文书
单位工作证明书格式
2014/10/04 职场文书
怎样写家长意见
2015/06/04 职场文书
Java 在生活中的 10 大应用
2021/11/02 Java/Android
python库Tsmoothie模块数据平滑化异常点抓取
2022/06/10 Python