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时区设置方法与pytz查询时区教程
Nov 27 Python
Python实现配置文件备份的方法
Jul 30 Python
Python中MySQLdb和torndb模块对MySQL的断连问题处理
Nov 09 Python
python实现网站的模拟登录
Jan 04 Python
Python图片裁剪实例代码(如头像裁剪)
Jun 21 Python
python使用itchat库实现微信机器人(好友聊天、群聊天)
Jan 04 Python
Python实现的建造者模式示例
Aug 06 Python
对python csv模块配置分隔符和引用符详解
Dec 12 Python
对python使用telnet实现弱密码登录的方法详解
Jan 26 Python
Python any()函数的使用方法
Oct 28 Python
PyQt5中向单元格添加控件的方法示例
Mar 24 Python
Python进行区间取值案例讲解
Aug 02 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中禁止单个IP与ip段访问的代码小结
2012/07/04 PHP
PHP实现的封装验证码类详解
2013/06/18 PHP
如何使用FireFox插件FirePHP调试PHP
2013/07/23 PHP
百度地图API应用之获取用户的具体位置
2014/06/10 PHP
如何使用GDB调试PHP程序
2015/12/08 PHP
jquery ajax例子返回值详解
2012/09/11 Javascript
javascript中有趣的反柯里化深入分析
2012/12/05 Javascript
检查输入的是否是数字使用keyCode配合onkeypress事件
2014/01/23 Javascript
当jQuery1.7遇上focus方法的问题
2014/01/26 Javascript
JS使用post提交的两种方式
2015/12/03 Javascript
js弹出窗口简单实现代码
2017/03/22 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
2017/04/10 jQuery
JavaScript实用代码小技巧
2018/08/23 Javascript
小程序hover-class点击态效果实现
2019/02/26 Javascript
Python实现简单截取中文字符串的方法
2015/06/15 Python
从头学Python之编写可执行的.py文件
2017/11/28 Python
用Python将mysql数据导出成json的方法
2018/08/21 Python
python判断列表的连续数字范围并分块的方法
2018/11/16 Python
python pygame模块编写飞机大战
2018/11/20 Python
Python使用pandas对数据进行差分运算的方法
2018/12/22 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
2019/04/01 Python
PyQt 图解Qt Designer工具的使用方法
2019/08/06 Python
django商品分类及商品数据建模实例详解
2020/01/03 Python
pandas和spark dataframe互相转换实例详解
2020/02/18 Python
Python 判断时间是否在时间区间内的实例
2020/05/16 Python
Python 分布式缓存之Reids数据类型操作详解
2020/06/24 Python
详解css3 object-fit属性
2018/07/27 HTML / CSS
基于HTML5 Canvas:字符串,路径,背景,图片的详解
2013/05/09 HTML / CSS
Html5在手机端调用相机的方法实现
2020/05/13 HTML / CSS
Sephora丝芙兰印尼官方网站:购买化妆品和护肤品
2018/07/02 全球购物
德国咖啡批发商:Coffeefair
2019/08/26 全球购物
瑞典香水、须后水和美容产品购物网站:Parfym-Klick.se
2019/12/29 全球购物
语文教育专业求职信
2014/06/28 职场文书
介绍信的格式
2015/01/30 职场文书
thinkphp 获取控制器及控制器方法
2021/04/16 PHP
详解Redis集群搭建的三种方式
2021/05/31 Redis