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

124 阅读3分钟

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):