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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值