分享

python超详细实现完整学生成绩管理系统

 禁忌石 2022-03-18

读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用Python实现一个完整版学生成绩管理系统,大家可以在过程中查缺补漏,提升水平

学生成绩管理系统简介

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

文章图片1
文章图片2
文章图片3
文章图片4
文章图片5
文章图片6

源代码

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

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)

原文链接:
https://www.jb51.net/article/241166.htm

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约