python学生成绩管理系统【完整版】

学生成绩管理系统

  • 学生成绩管理系统简介
    • 源代码
      • students.txt
      • main.py
      • Login.py
      • db.py
      • MenuPage.py
      • view.py

学生成绩管理系统简介

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

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

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

在这里插入图片描述

源代码

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

students.txt

用于存储数据

main.py

from tkinter import *from Login import *import tkinter as tkroot = 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 jsonclass 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 tkfrom 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 tkfrom db import dbfrom 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的活动,还请大家多多三连支持一下博主,你们的支持就是我创作的动力💖

在这里插入图片描述

CSDN社区 《创作达人》活动,只要参与其中并创作文章就有机会获得官方奖品:精品日历、新程序员杂志,快来参与吧!链接直达 https://bbs.csdn.net/topics/605272551

 
友情链接
鄂ICP备19019357号-22