python基于Tkinter实现学生信息管理系统

一、功能点介绍(毕设设计)

1.添加学生成绩:管理员可以在系统中添加学生的成绩信息,包括学生姓名、学号、课程名称、成绩等。
2.删除学生成绩:管理员可以根据学生的学号或者姓名删除学生的成绩信息。
3.修改学生成绩:管理员可以修改学生的成绩信息,包括学生姓名、学号、课程名称、成绩等。
4.查询学生成绩:管理员可以根据学生的学号或者姓名查询学生的成绩信息,包括学生姓名、学号、课程名称、成绩等。
该系统可以帮助学校管理学生成绩信息,方便教师和学生查询自己的成绩情况,也可以帮助学校更加科学地进行教学管理。

二、登录页面代码介绍

新建一个Loginpage.py文件

#!/usr/bin/env python
# encoding: utf-8
"""
@author: 拾壹
@software: PyCharm
@file: LoginPage.py
@time: 2023/3/7 13:20
"""
import tkinter as tk
from tkinter import messagebox
from db import db
from MinaPage import MianPage


class LoginPage(object):
    def __init__(self, master):
        self.root = master
        self.root.geometry('300x180')
        self.root.title('登录页面')

        self.username = tk.StringVar()
        self.password = tk.StringVar()

        self.page = tk.Frame(root)
        self.page.pack()
        tk.Label(self.page).grid(row=0, column=0)

        tk.Label(self.page, text='账号:').grid(row=1, column=1, pady=10)
        tk.Entry(self.page, textvariable=self.username).grid(row=1, column=2)

        tk.Label(self.page, text='密码:').grid(row=2, column=1, pady=10)
        tk.Entry(self.page, textvariable=self.password).grid(row=2, column=2)
        tk.Button(self.page, text='登录', command=self.login).grid(row=3, column=1, pady=10)
        tk.Button(self.page, text='退出', command=self.page.quit).grid(row=3, column=2, pady=10)

    def login(self):
        name = self.username.get()
        pwd = self.password.get()
        flag, message = db.check_login(name, pwd)
        if flag:
            # 銷毀當前頁面
            self.page.destroy()
            MianPage(self.root)
        else:
            messagebox.showwarning(title='警告', message=message)


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

三、增删改查页面设计

新建一个MinaPage.py文件

#!/usr/bin/env python
# encoding: utf-8
"""
@author: 拾壹
@software: PyCharm
@file: MinaPage.py
@time: 2023/3/7 22:08
"""
import tkinter as tk

from views import AboutFrame, ChangeFrame, DeleteFrame, SearchFrame, InsertFrame


class MianPage:
    def __init__(self, master: tk.Tk):
        self.root = master
        self.root.title('學生信息管理系統')
        self.root.geometry('600x400')
        self.create_page()

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

        menubar = tk.Menu(self.root)
        menubar.add_command(label='录入', command=self.show_insert)
        menubar.add_command(label='查询', command=self.show_select)
        menubar.add_command(label='删除', command=self.show_delete)
        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.insert_frame.pack_forget()
        self.search_frame.pack_forget()
        self.delete_frame.pack_forget()
        self.chang_frame.pack_forget()
        self.about_frame.pack()

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

    def show_select(self):
        self.insert_frame.pack_forget()
        self.search_frame.pack()
        self.delete_frame.pack_forget()
        self.chang_frame.pack_forget()
        self.about_frame.pack_forget()

    def show_delete(self):
        self.insert_frame.pack_forget()
        self.search_frame.pack_forget()
        self.delete_frame.pack()
        self.chang_frame.pack_forget()
        self.about_frame.pack_forget()

    def show_insert(self):
        self.insert_frame.pack()
        self.search_frame.pack_forget()
        self.delete_frame.pack_forget()
        self.chang_frame.pack_forget()
        self.about_frame.pack_forget()


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

四、视图逻辑管理

新建一个views.py文件

#!/usr/bin/env python
# encoding: utf-8
"""
@author: 拾壹
@software: PyCharm
@file: views.py
@time: 2023/3/8 13:57
"""
import tkinter as tk
from tkinter import ttk

from db import db


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.name = tk.StringVar()
        self.math = tk.StringVar()
        self.chinese = tk.StringVar()
        self.english = tk.StringVar()
        self.status = tk.StringVar()
        tk.Label(self).grid(row=0, pady=10)
        tk.Label(self, text='姓 名:').grid(row=1, column=1, pady=10)
        tk.Entry(self, textvariable=self.name).grid(row=1, 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.search_user).grid(row=5,column=1,pady=10)
        tk.Button(self, text='修改', command=self.change_user).grid(row=5, column=2, pady=10)


    def search_user(self):
        flag, info = db.search_by_useranme(self.name.get())
        if flag:
            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_user(self):
        stu = {"name": self.name.get(),
               "math": self.math.get(),
               "chinese": self.chinese.get(),
               "english": self.english.get()}
        self.name.set('')  # 把名字重置为空
        db.update(stu)
        self.status.set('修改数据成功')

class InsertFrame(tk.Frame):
    def __init__(self, root):
        super().__init__(root)
        # tk.Label(self, text='插入').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).grid(row=0, pady=10)
        tk.Label(self, text='姓 名:').grid(row=1, column=1, pady=10)
        tk.Entry(self, textvariable=self.name).grid(row=1, 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 = {"name": self.name.get(),
               "math": self.math.get(),
               "chinese": self.chinese.get(),
               "english": self.english.get()}
        self.name.set('')  # 把名字重置为空
        db.insert(stu)
        self.status.set('数据录入成功')


class SearchFrame(tk.Frame):
    def __init__(self, root):
        super().__init__(root)
        tk.Label(self, text='查询').pack()


class DeleteFrame(tk.Frame):
    def __init__(self, root):
        super().__init__(root)
        self.username = tk.StringVar()
        self.status = tk.StringVar()
        tk.Label(self, text='根据名字删除数据').pack()
        tk.Entry(self, textvariable=self.username).pack()
        tk.Button(self, text='删除', command=self.delete).pack()
        # tk.Label(self, text=self.status).pack()

    def delete(self):
        username = self.username.get()
        flag,message = db.delete_by_useranme(username)
        self.status.set(message)


class SearchFrame(tk.Frame):
    def __init__(self, root):
        super().__init__(root)
        self.table_view = tk.Frame()
        self.table_view.pack()
        self.create_page()

    def create_page(self):
        columns = ('name', 'chinese', 'math', 'english')
        columns_values = ('姓名', '语文', '数学', '英语')
        self.tree_view = ttk.Treeview(self, show='headings', columns=columns)
        # self.table_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(fill=tk.BOTH, expand=True)
        self.show_data_frame()

        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
        student = db.all()
        index = 0
        for stu in student:
            self.tree_view.insert('', index+1, values=(
                stu['name'],stu['math'],stu['chinese'],stu['english'],
            ))

五、数据库逻辑处理

新建一个db.py文件

#!/usr/bin/env python
# encoding: utf-8
"""
@author: 拾壹
@software: PyCharm
@file: db.py
@time: 2023/3/7 14:39
"""
import json


class MysqlDatabases:
    def __init__(self):
        self.users = json.loads(open('user.json', mode='r', encoding='utf-8').read())
        self.students = json.loads(open('students.json', mode='r', encoding='utf-8').read())

    def check_login(self, username, password):
        for user in self.users:
            if username == user['username']:
                if password == user['password']:
                    return True, '登錄成功'
                else:
                    return False, '密碼錯誤'
            else:
                return False,'賬號錯誤'
        return False, '登錄失敗'

    def all(self):
        return self.students

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

    def delete_by_useranme(self, name):
        for student in self.students:
            if student['name'] == name:
                self.students.remove(student)
                return True, f'{name}用户删除成功'
        return False, f'{name}用户不存在'

    def search_by_useranme(self, name):
        for student in self.students:
            if student['name'] == name:

                return True, student
        return False, f'{name}用户不存在'

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


db = MysqlDatabases()


if __name__ == '__main__':
    print(db.check_login('admin', '123456'))

六、准备学生数据,建立一个json文件

新建一个students.json文件

[
  {"name": "张三", "math": "65", "chinese": "75","english": 100},
  {"name": "李四", "math": "65", "chinese": "75","english": 100},
  {"name": "王五", "math": "65", "chinese": "75","english": 100}
]

七、准备用户数据,建立一个json文件

新建一个user.json文件

[
  {"username": "admin", "password": "123456"},
  {"username": "admin1", "password": "123456"}
]

八、系统展示

  1. 登录页

python基于Tkinter实现学生信息管理系统_第1张图片

  1. 增删改查页面

python基于Tkinter实现学生信息管理系统_第2张图片

八、优缺点:

优点:
1.提高工作效率:学生成绩管理系统可以使管理员更快捷、准确地管理学生成绩信息,提高工作效率。
2.管理方便:学生成绩管理系统可以将学生成绩信息集中管理,方便管理员进行数据统计和分析,从而更好地了解学生成绩情况。
3.信息准确:学生成绩管理系统可以确保学生的成绩信息准确无误,并且可以及时更新和维护学生成绩信息。
4.易于操作:学生成绩管理系统的操作简单易懂,管理员可以快速上手,不需要花费大量的时间和精力学习。
缺点:
1.安全性问题:学生成绩管理系统中包含学生的个人信息,如姓名、学号等,如果系统存在安全漏洞或被黑客攻击,可能会导致学生信息泄露。
2.技术要求高:学生成绩管理系统需要一定的技术支持,如果管理员技术水平低,可能会导致系统出现故障或者数据丢失等问题。
3.费用较高:学生成绩管理系统需要购买软件并进行维护和更新,如果学校没有足够的预算,可能会造成经济压力。

九、备注

增删改查成绩学生成绩管理系统是一个比较实用的软件,也是很多学校和教师必备的工具之一,因此,作为毕设的话是一个不错的选择。但是,如果只是简单地完成一个增删改查的功能可能会比较简单,需要在实现基本功能的基础上,增加一些创新的设计和实现,才能够使毕设更具有研究和实践价值。同时,需要考虑到该系统的安全性、性能、可扩展性等问题,尽可能地完善和优化系统的各项功能和性能,从而提高该系统的实用性和可靠性。

你可能感兴趣的:(python)