学生管理系统可视化

学生管理系统可视化

使用python包tkinter制作的简单的学生管理系统
提示:需在同名文件夹下创建两个文档:
1.students.text
2.students.json
所使用的包有json,tkinter,pyperclip

代码主要为下面三部分
MainPage

主函数

import tkinter as tk
from views import AboutFrame, ChangeFrame, SearchFrame, InsertFrame


class MainPage:
    def __init__(self, master):
        self.root = master
        self.root.title('学生信息管理系统 V1.5')
        self.root.geometry('500x320')
        self.create_page()

    def create_page(self):
        self.about_frame = AboutFrame(self.root)
        self.change_frame = ChangeFrame(self.root)
        self.insert_frame = InsertFrame(self.root)
        self.search_frame = SearchFrame(self.root)

        menubar = tk.Menu(self.root)
        menubar.add_command(label='录入', command=self.show_insert)
        menubar.add_command(label='查询', command=self.show_search)
        menubar.add_command(label='编辑', command=self.show_change)
        menubar.add_command(label='关于', command=self.show_about)
        self.root['menu'] = menubar

    def show_about(self):
        self.about_frame.pack()
        self.change_frame.pack_forget()
        self.search_frame.pack_forget()

        self.insert_frame.pack_forget()

    def show_change(self):
        self.change_frame.pack()
        self.about_frame.pack_forget()
        self.insert_frame.pack_forget()
        self.search_frame.pack_forget()

    def show_insert(self):
        self.insert_frame.pack()
        self.change_frame.pack_forget()
        self.about_frame.pack_forget()

        self.search_frame.pack_forget()

    def show_search(self):
        self.search_frame.pack()
        self.change_frame.pack_forget()
        self.insert_frame.pack_forget()

        self.about_frame.pack_forget()


if __name__ == '__main__':
    root = tk.Tk()
    MainPage(root)
    root.mainloop()

db

处理json文件中的数据

import json

filename = 'students.json'


class MysqlDatabases:

    def __init__(self):
        self.students = json.loads(open(filename, mode='r', encoding='gbk').read())

    def allstudents(self):
        return self.students

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

    def delete_by_username(self, name):
        for student in self.students:
            if student['name'] == name:
                self.students.remove(student)
                return True, f'学生{name}删除成功'
            else:
                if student['id'] == name:
                    self.students.remove(student)
                    return True, f'学生{name}删除成功'
        return False, f'学生{name}不存在'

    def search_by_username(self, name):
        for student in self.students:
            if student['name'] == name:
                return True, student
            else:
                if student['id'] == name:
                    return True, student
        return False, f'学生{name}不存在'

    def updata(self, stu, name):
        for student in self.students:
            if student['name'] == name:
                student.update(stu)
                return True, f'学生{stu["name"]}数据修改成功'
            else:
                if student['id'] == name:
                    student.update(stu)
                    return True, f'学生{stu["name"]}数据修改成功'
        return False, f'{name}用户不存在'


db = MysqlDatabases()

view

主要逻辑代码

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


class AboutFrame(tk.Frame):
    def __init__(self, root):
        super().__init__(root)
        tk.Label(self, text='本作品由tkinter制作').pack()
        tk.Label(self, text='关于作者').pack()
        tk.Label(self, text='感谢使用').pack()


class ChangeFrame(tk.Frame):
    def __init__(self, root):
        super().__init__(root)
        self.id = tk.StringVar()
        self.name = tk.StringVar()
        self.math = tk.StringVar()
        self.chinese = tk.StringVar()
        self.english = tk.StringVar()
        self.status = tk.StringVar()
        self.username = tk.StringVar()
        self.create_page()

    def create_page(self):

        tk.Label(self, text='输入ID或姓名').grid(row=1, column=0)
        tk.Entry(self, textvariable=self.username).grid(row=1, column=1, padx=10)

        tk.Label(self, text='学生信息').grid(row=2, column=0)

        tk.Label(self, text='学生ID:').grid(row=4, column=0, pady=10)
        tk.Entry(self, textvariable=self.id).grid(row=4, column=1, pady=10)

        tk.Label(self, text='姓 名:').grid(row=3, column=0, pady=10)
        tk.Entry(self, textvariable=self.name).grid(row=3, column=1, pady=10)

        tk.Label(self, text='数 学:').grid(row=5, column=0, pady=10)
        tk.Entry(self, textvariable=self.math).grid(row=5, column=1, pady=10)

        tk.Label(self, text='语 文:').grid(row=6, column=0, pady=10)
        tk.Entry(self, textvariable=self.chinese).grid(row=6, column=1, pady=10)

        tk.Label(self, text='英 语:').grid(row=7, column=0, pady=10)
        tk.Entry(self, textvariable=self.english).grid(row=7, column=1, pady=10)

        tk.Button(self, text='查询', command=self.search).grid(row=1, column=2)
        tk.Button(self, text='修改', command=self.change).grid(row=8, column=2)
        tk.Button(self, text='删除', command=self.delete, bg='red').grid(row=8, column=0)

        tk.Label(self, textvariable=self.status).grid(row=2, column=1, pady=5, stick=tk.E)

    def search(self):
        flag, info = db.search_by_username(self.username.get())
        if flag:
            self.id.set(info['id'])
            self.name.set(info['name'])
            self.math.set(info['math'])
            self.chinese.set(info['chinese'])
            self.english.set(info['english'])
            self.status.set('查询成功')
        else:
            self.status.set(info)

    def change(self):
        stu = {"id": self.id.get(), "name": self.name.get(), "math": self.math.get(), "chinese": self.english.get(),
               "english": self.english.get()}
        try:
            if int(stu['math']) in range(101) and int(stu['chinese']) in range(101) and int(
                    stu['english']) in range(101):
                flag, info = db.updata(stu, self.username.get())
                if flag:
                    students = db.allstudents()
                    save(students)
                    self.id.set('')
                    self.name.set('')
                    self.math.set('')
                    self.chinese.set('')
                    self.english.set('')
                    self.status.set(info)
                else:
                    self.status.set(info)
            else:
                self.status.set('超出分数范围0-100')
        except:
            print('修改失败,请检查数据')

    def delete(self):
        username = self.username.get()
        flag, message = db.delete_by_username(username)
        students = db.allstudents()
        save(students)
        self.status.set(message)


class InsertFrame(tk.Frame):
    def __init__(self, root):
        super().__init__(root)

        self.id = tk.StringVar()
        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, text='学生ID:').grid(row=1, column=1, pady=10)
        tk.Entry(self, textvariable=self.id).grid(row=1, column=2, pady=10)

        tk.Label(self, text='姓 名:').grid(row=0, column=1, pady=10)
        tk.Entry(self, textvariable=self.name).grid(row=0, column=2, pady=10)

        tk.Label(self, text='数 学:').grid(row=2, column=1, pady=10)
        tk.Entry(self, textvariable=self.math).grid(row=2, column=2, pady=10)

        tk.Label(self, text='语 文:').grid(row=3, column=1, pady=10)
        tk.Entry(self, textvariable=self.chinese).grid(row=3, column=2, pady=10)

        tk.Label(self, text='英 语:').grid(row=4, column=1, pady=10)
        tk.Entry(self, textvariable=self.english).grid(row=4, column=2, pady=10)

        tk.Button(self, text='录入', command=self.recode_info).grid(row=5, column=2, pady=10)

        tk.Label(self, textvariable=self.status).grid(row=6, column=2, pady=10, stick=tk.E)

    def recode_info(self):

        stu = {"id": self.id.get(), "name": self.name.get(), "math": self.math.get(), "chinese": self.english.get(),
               "english": self.english.get()}
        if not db.allstudents():
            try:
                if int(stu['math']) in range(101) and int(stu['chinese']) in range(101) and int(
                        stu['english']) in range(101):

                    self.status.set('创建数据成功')
                    self.name.set('')
                    self.id.set('')
                    self.math.set('')
                    self.chinese.set('')
                    self.english.set('')
                    db.insert(stu)
                    students = db.allstudents()
                    save(students)

                else:
                    self.status.set('超出分数范围0-100')
            except:
                self.status.set('录入出现错误')
        else:
            # with open('students.text', 'r', encoding='gbk') as r:
            #     studentlist = r.readlines()
            students = db.allstudents()
            student_id = get_id(students)
            for item in students:
                # d = dict(eval(item))

                if int(stu['id']) not in student_id:
                    try:
                        if int(stu['math']) in range(101) and int(stu['chinese']) in range(101) and int(
                                stu['english']) in range(101):

                            self.status.set('提交数据成功')
                            self.name.set('')
                            self.id.set('')
                            self.math.set('')
                            self.chinese.set('')
                            self.english.set('')
                            db.insert(stu)
                            students = db.allstudents()
                            save(students)
                            break

                        else:
                            self.status.set('超出分数范围0-100')
                    except:
                        self.status.set('录入出现错误')

                else:
                    self.status.set('学生ID已存在')


class SearchFrame(tk.Frame):
    def __init__(self, root):
        self.var3 = tk.StringVar()
        super().__init__(root)

        self.table_view = tk.Frame()
        self.table_view.pack()
        self.create_page()

    def create_page(self):
        columns = ("id", "name", "chinese", "math", "english", "grade")
        columns_values = ("ID", "姓名", "语文", "数学", "英语", "总分")
        self.tree_view = ttk.Treeview(self, show='headings', columns=columns)
        self.tree_view.column('id', width=80, anchor='center')
        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.column('grade', width=80, anchor='center')
        self.tree_view.heading('id', text='ID')
        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.heading('grade', text='总分')
        self.tree_view.pack(fill=tk.BOTH, expand=True)

        radiobutton1 = tk.Radiobutton(self, text='总分', variable=self.var3, value='grade')
        radiobutton1.pack(side="left")

        radiobutton2 = tk.Radiobutton(self, text='语文', variable=self.var3, value='chinese')
        radiobutton2.pack(side="left")

        radiobutton3 = tk.Radiobutton(self, text='数学', variable=self.var3, value='math')
        radiobutton3.pack(side="left")

        radiobutton4 = tk.Radiobutton(self, text='英语', variable=self.var3, value='english')
        radiobutton4.pack(side="left")

        tk.Button(self, text='刷新并保存数据', command=self.show_data_frame).pack(anchor=tk.E, pady=5)

    def show_data_frame(self):
        # 删除旧阶段
        for _ in map(self.tree_view.delete, self.tree_view.get_children('')):
            pass
        students = db.allstudents()

        if self.var3.get() == 'grade':
            index = -100000
            sorted(students, key=lambda x: int(x['chinese']) + int(x['math']) + int(x['english']),
                   reverse=False)
            save(students)

            for stu in students:
                self.tree_view.insert('', index + 1,
                                      values=(stu['id'], stu['name'], stu['chinese'], stu['math'], stu['english'],
                                              int(stu['chinese']) + int(stu['math']) + int(stu['english'])))

        elif self.var3.get() == 'chinese':
            index = -100000
            sorted(students, key=lambda x: int(x['chinese']), reverse=False)
            save(students)

            for stu in students:
                self.tree_view.insert('', index + 1,
                                      values=(stu['id'], stu['name'], stu['chinese'], stu['math'], stu['english'],
                                              int(stu['chinese']) + int(stu['math']) + int(stu['english'])))
        elif self.var3.get() == 'math':
            index = -1000000
            sorted(students, key=lambda x: int(x['math']), reverse=False)
            save(students)

            for stu in students:
                self.tree_view.insert('', index + 1,
                                      values=(stu['id'], stu['name'], stu['chinese'], stu['math'], stu['english'],
                                              int(stu['chinese']) + int(stu['math']) + int(stu['english'])))
        elif self.var3.get() == 'english':
            index = -1000000
            sorted(students, key=lambda x: int(x['english']), reverse=False)
            save(students)

            for stu in students:
                self.tree_view.insert('', index + 1,
                                      values=(stu['id'], stu['name'], stu['chinese'], stu['math'], stu['english'],
                                              int(stu['chinese']) + int(stu['math']) + int(stu['english'])))


def save(lst):
    with open('students.text', 'w') as w:
        w.write(str(lst))
    translate('students.text', 'students.json')


def get_id(lst):
    student_id = []
    for item in lst:
        num = int(item['id'])
        student_id.append(num)
    return student_id


def translate(text, json):
    with open(text, 'r', encoding='gbk') as r:
        load = r.read()
        load_json = load.replace('\'', '\"')
        x = f'{load_json}'
    pyperclip.copy(x)
    text = pyperclip.paste()

    with open(json, 'w', encoding='gbk') as w:
        w.write(text)

运行截图
主界面录入查询编辑

缺点部分功能实现代码过于冗杂,或方法过于繁琐。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值