学生成绩管理系统(python)

 01.写在前面

可以把这个版本称为:学生成绩管理系统GUI重制——破烂版。

主体代码参考同类 ,在其基础上进行了一些修改,并套了GUI外壳,因为自己是最近抱着兴趣看的gui,所以框架也是参考的菜鸟python里面,写的很烂,暂时也没时间改,供大家看看。欢迎交流!

02主体代码

from tkinter import *
import os
import tkinter.messagebox as messagebox

class MY_GUI():
    def __init__(self,init_window_name):
        self.init_window_name = init_window_name
        #设置学生数据路径
        self.filename = "D:\\student_data.txt"
        #排序标识符
        self.asc_or_desc = 0


    #设置窗口
    def set_init_window(self):
        self.init_window_name.title("学生数据管理系统_v1.0")           #窗口名
        #self.init_window_name.geometry('320x160+10+10')              #290 160为窗口大小,+10 +10 定义窗口弹出时的默认展示位置
        self.init_window_name.geometry('640x320+10+10')
        #self.init_window_name["bg"] = ""                             #窗口背景色,其他背景色见:blog.csdn.net/chl0000/article/details/7657887
        #self.init_window_name.attributes("-alpha",0.8)               #虚化,值越小虚化程度越高
    #容器 (生成用户输入界面,不建议该方法)
        self.FrameList = [1]*100
        self.Input_Frame = [0]*100
        self.Id_Entry = [1]*100
        self.Name_Entry = [1]*100
        self.English_Entry = [1]*100
        self.Python_Entry = [1]*100
        self.Java_Entry = [1]*100
        self.Id_Label = [1]*100
        self.Name_Label = [1]*100
        self.English_Label = [1]*100
        self.Python_Label = [1]*100
        self.Java_Label = [1]*100
        self.Frame_Button = [1]*100
        self.offNum = 0
        self.textIn = ["录入", "查询", "删除", "修改","排序"]
        for i in range(len(self.textIn)):
            self.FrameList[i]=(Frame(self.init_window_name, ))
            #self.FrameList[i].configure(background="red")
            self.Input_Frame[0+i*6] = Frame(self.FrameList[i])
            self.Input_Frame[1+i*6] = Frame(self.FrameList[i])
            self.Input_Frame[2+i*6] = Frame(self.FrameList[i])
            self.Input_Frame[3+i*6] = Frame(self.FrameList[i])
            self.Input_Frame[4+i*6] = Frame(self.FrameList[i])
            self.Input_Frame[5+i*6] = Frame(self.FrameList[i])
            self.Input_Frame[0+i*6].pack()
            self.Input_Frame[1+i*6].pack()
            self.Input_Frame[2+i*6].pack()
            self.Input_Frame[3+i*6].pack()
            self.Input_Frame[4+i*6].pack()
            self.Input_Frame[5+i*6].pack()
            if i == 0:
                self.Id_Label[i]=(Label(self.Input_Frame[0+i*6],        text="ID:     "))
                self.Name_Label[i]=(Label(self.Input_Frame[1+i*6],      text="Name:   "))
                self.English_Label[i]=(Label(self.Input_Frame[2+i*6],   text="English:"))
                self.Python_Label[i]=(Label(self.Input_Frame[3+i*6],    text="Python: "))
                self.Java_Label[i]=(Label(self.Input_Frame[4+i*6],      text="Java:   "))
                self.Id_Entry[i]=(Entry(self.Input_Frame[0+i*6]))
                self.Name_Entry[i]=(Entry(self.Input_Frame[1+i*6]))
                self.English_Entry[i]=(Entry(self.Input_Frame[2+i*6]))
                self.Python_Entry[i]=(Entry(self.Input_Frame[3+i*6]))
                self.Java_Entry[i]=(Entry(self.Input_Frame[4+i*6]))
                self.Id_Label[i].pack(side = "left")
                self.Id_Entry[i].pack(side = "right")
                self.Name_Label[i].pack(side = "left")
                self.Name_Entry[i].pack(side = "right")
                self.English_Label[i].pack(side = "left")
                self.English_Entry[i].pack(side = "right")
                self.Python_Label[i].pack(side = "left")
                self.Python_Entry[i].pack(side = "right")
                self.Java_Label[i].pack(side = "left")
                self.Java_Entry[i].pack(side = "right")
                self.Frame_Button[i]=(Button(self.Input_Frame[5+i*6], text=self.textIn[i], command= self.insert))
            elif i == 1:
                self.Frame_Button[i]=(Button(self.Input_Frame[5+i*6], text=self.textIn[i], command= self.search))
                self.Id_Label[i]=(Label(self.Input_Frame[0+i*6],        text="ID:     "))
                self.Name_Label[i]=(Label(self.Input_Frame[1+i*6],      text="Name:   "))
                self.Id_Entry[i]=(Entry(self.Input_Frame[0+i*6]))
                self.Name_Entry[i]=(Entry(self.Input_Frame[1+i*6]))
                self.Id_Label[i].pack(side = "left")
                self.Id_Entry[i].pack(side = "right")
                self.Name_Label[i].pack(side = "left")
                self.Name_Entry[i].pack(side = "right")
            elif i == 2:
                self.Id_Label[i]=(Label(self.Input_Frame[0+i*6],        text="ID:     "))
                self.Id_Entry[i]=(Entry(self.Input_Frame[0+i*6]))
                self.Id_Label[i].pack(side = "left")
                self.Id_Entry[i].pack(side = "right")
                self.Frame_Button[i]=(Button(self.Input_Frame[5+i*6], text=self.textIn[i], command= self.delete))
            elif i == 3:
                self.Id_Label[i]=(Label(self.Input_Frame[0+i*6],        text="ID:     "))
                self.Name_Label[i]=(Label(self.Input_Frame[1+i*6],      text="Name:   "))
                self.English_Label[i]=(Label(self.Input_Frame[2+i*6],   text="English:"))
                self.Python_Label[i]=(Label(self.Input_Frame[3+i*6],    text="Python: "))
                self.Java_Label[i]=(Label(self.Input_Frame[4+i*6],      text="Java:   "))
                self.Id_Entry[i]=(Entry(self.Input_Frame[0+i*6]))
                self.Name_Entry[i]=(Entry(self.Input_Frame[1+i*6]))
                self.English_Entry[i]=(Entry(self.Input_Frame[2+i*6]))
                self.Python_Entry[i]=Entry(self.Input_Frame[3+i*6])
                self.Java_Entry[i]=(Entry(self.Input_Frame[4+i*6]))
                self.Id_Label[i].pack(side = "left")
                self.Id_Entry[i].pack(side = "right")
                self.Name_Label[i].pack(side = "left")
                self.Name_Entry[i].pack(side = "right")
                self.English_Label[i].pack(side = "left")
                self.English_Entry[i].pack(side = "right")
                self.Python_Label[i].pack(side = "left")
                self.Python_Entry[i].pack(side = "right")
                self.Java_Label[i].pack(side = "left")
                self.Java_Entry[i].pack(side = "right")
                self.Frame_Button[i]=(Button(self.Input_Frame[5+i*6], text=self.textIn[i], command= self.modify))
            elif i ==4:
                self.sort_mode = StringVar()
                #默认初始选项
                self.sort_mode.set("1")
                self.sort_modezero = Radiobutton(self.FrameList[i], text="english", variable=self.sort_mode, value="1")
                self.sort_modeone = Radiobutton(self.FrameList[i], text="python", variable=self.sort_mode,value="2")
                self.sort_modetwo = Radiobutton(self.FrameList[i], text="java", variable= self.sort_mode, value="3")
                self.sort_modethree = Radiobutton(self.FrameList[i], text="总分", variable=self.sort_mode, value="4")
                self.sort_modezero.pack()
                self.sort_modeone.pack()
                self.sort_modetwo.pack()
                self.sort_modethree.pack()

                self.Frame_Button[i]=(Button(self.Input_Frame[5+i*6], text=self.textIn[i], command= self.sort))
            self.Frame_Button[i].pack()

        self.select_frame = Frame(self.init_window_name, )
        self.output_frame = Frame(self.init_window_name, )
        self.select_frame.pack(side="left")
        self.output_frame.pack(side="left")
        self.FrameList[0].pack(side="left")
    #标签

    #按钮
        self.insert_button = Button(self.select_frame, text='\t录入学生信息\t\t',command=lambda: self.framepack(0))
        self.insert_button.pack()
        self.search_button = Button(self.select_frame, text='\t查找学生信息\t\t', command=lambda: self.framepack(1))
        self.search_button.pack()
        self.delete_button = Button(self.select_frame, text='\t删除学生信息\t\t', command=lambda: self.framepack(2))
        self.delete_button.pack()
        self.modify_button = Button(self.select_frame, text='\t修改学生信息\t\t', command=lambda: self.framepack(3))
        self.modify_button.pack()
        self.sort_button = Button(self.select_frame, text='\t对学生成绩排序\t\t', command=lambda: self.framepack(4))
        self.sort_button.pack()
        self.total_button = Button(self.select_frame, text='\t统计学生总人数\t\t', command=self.total)
        self.total_button.pack()
        self.show_button = Button(self.select_frame, text='\t显示所有学生信息\t\t', command=self.show)
        self.show_button.pack()
        self.quit_button = Button(self.select_frame, text='\t退出程序   \t\t', command=lambda: quit())
        self.quit_button.pack()
    
    #输入
        
    #文本
        self.output_text = Text(self.output_frame, width=27)
        scrollbar = Scrollbar(self.output_frame, command=self.output_text.yview)
        scrollbar.pack(side="right", fill="y")
        self.output_text.pack(side="left", fill="both", expand=True)

#功能函数区域
    def framepack(self, num):
        self.FrameList[self.offNum].pack_forget()  
        self.offNum = num
        self.FrameList[num].pack(side="left")
    def insert(self):
        #插入
        self.output_text.see(END)
        student_list = []
        id = self.Id_Entry[0].get()
        if not id.strip():
            messagebox.showinfo(title='display_messagebox',
		message='请输入学生Id')
            return
        name = self.Name_Entry[0].get()
        if not name.strip():
            messagebox.showinfo(title='display_messagebox',
		message='请输入学生姓名')
            return
        try:
            english = int(self.English_Entry[0].get())
            python = int(self.Python_Entry[0].get())
            java = int(self.Java_Entry[0].get())
        except:
            messagebox.showinfo(title='display_messagebox',
		message='分数输入无效,请重新输入')
            return
        # 将录入的学生信息保存在字典中
        student = {'id': id, 'name': name, 'english': english, 'python': python, 'java': java}
        # 将学生信息添加到列表中
        # 调用save函数保存信息
        if os.path.exists(self.filename):
            with open(self.filename, 'r', encoding='utf-8') as file:
                student_list = file.readlines()
                if not student_list:
                    self.save(student)
                try:
                    for item in student_list:
                        d = dict(eval(item))
                        if d['id'] == id:
                            messagebox.showinfo(title='display_messagebox',
            message='该学生信息已存在于系统中。')
                            return
                    self.save(student)
                except:
                    pass
        else:
            self.save(student)

    
    def save(self, lst):
        try:
            if os.path.exists(self.filename):
                print("添加")
                with open(self.filename, 'a', encoding='utf-8') as file:
                    file.write(str(lst)+"\n")
            else:
                print("新建")
                with open(self.filename, 'w', encoding='utf-8') as file:
                    file.write(str(lst)+"\n")
            messagebox.showinfo(title='display_messagebox',
		message='录入成功!!!')
        except:
            messagebox.showinfo(title='display_messagebox',
		message='录入失败!!!')
    
        
    def search(self):
        self.output_text.see(END)
        student_query = []
        id = self.Id_Entry[1].get().strip()
        name = self.Name_Entry[1].get().strip()
        if (not id) and (not name) :
            messagebox.showinfo(title='display_messagebox',
		message='请输入学生Id或姓名')
            return
        if os.path.exists(self.filename):
            with open(self.filename, 'r', encoding='utf-8') as file:
                student = file.readlines()
                for item in student:
                    d = dict(eval(item))
                    if d['id'] == id:
                        student_query.append(d)
                    elif d['name'] == name:
                        student_query.append(d)
            self.show_query(student_query)
        else:
            self.output_text.insert(END, "无学生信息\n")
            #print("无学生信息")
            return
   
    def show_query(self, lst):
        #将学生信息录入文本框
        if len(lst) == 0:
            #print("无相关信息")
            self.output_text.insert(END, "无学生信息\n")
            return  
        for item in lst:
            format_str = f"ID:{item.get('id')}\n姓名:{item.get('name')}\n英语成绩:{item.get('english')}\npython成绩:{item.get('python')}\njava成绩:{item.get('java')}\n总成绩:{int( item.get('english')) + int( item.get('english')) + int(item.get('java'))}\n"
            self.output_text.insert(END, format_str+"\n")
    
    def delete(self):
        self.output_text.see(END)
        student_id = self.Id_Entry[2].get().strip()
        #print(student_id)
        if student_id:
            if os.path.exists(self.filename):
                with open(self.filename,'r',encoding='utf-8') as file:
                    student_old = file.readlines()
            else:
                student_old = []
            flag = False
            if student_old:  # 空列表等于 False,非空列表等于True
                with open(self.filename,'w',encoding='utf-8') as wfile:
                    # 只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除
                    d = {}
                    for item in student_old:
                        d = dict(eval(item))  # 将字符串转换为字典
                        if d['id'] != student_id:
                            wfile.write(str(d)+'\n')
                        else:
                            flag = True
                    if flag:
                        self.output_text.insert(END, f'id为{student_id}的学生信息已被删除'+"\n")
                        #print(f'id为{student_id}的学生信息已被删除')
                    else:
                        self.output_text.insert(END, f'没有找到学生ID为{student_id}的学生'+"\n")
                        #print(f'没有找到学生ID为{student_id}的学生')
            else:
                self.output_text.insert(END, "无学生信息"+"\n")
                #print("无学生信息")
        else:
                self.output_text.insert(END, "请输入需要删除学生的ID"+"\n")
   
    def modify(self):
        self.output_text.see(END)
        if os.path.exists(self.filename):
            with open(self.filename, 'r', encoding='utf-8') as file:
                student_old = file.readlines()
        else:
            return
        student_id = self.Id_Entry[3].get().strip()
        a = self.Name_Entry[3].get().strip()
        try:
            b = int(self.English_Entry[3].get().strip())
            c = int(self.Python_Entry[3].get().strip())
            d = int(self.Java_Entry[3].get().strip())
        except:
            messagebox.showinfo(title='display_messagebox',
		message='输入分数有误!!!')
            return
        if a and b and c and d:
            with open(self.filename, 'w', encoding='utf-8') as wfile:
                for item in student_old:
                    d = {}
                    d = dict(eval(item))
                    if d['id'] == student_id:
                        d['name'] = self.Name_Entry[3].get().strip()
                        d['english'] = self.English_Entry[3].get().strip()
                        d['python'] = self.Python_Entry[3].get().strip()
                        d['java'] = self.Java_Entry[3].get().strip()
                        self.output_text.insert(END, "已经找到学生信息,开始修改相关信息\n")
                        #print("已经找到学生信息,请修改相关信息")
                        wfile.write(str(d) + '\n')
                        self.output_text.insert(END, "修改成功\n")                
                    else:
                        wfile.write(str(d) + '\n')
        else:
            self.output_text.insert(END, "输入有误\n") 

    
    def sort(self):
        self.output_text.see(END)
        #self.show()
        self.output_text.delete(1.0, END)
        if self.asc_or_desc == 0:
            self.asc_or_desc = 1
            self.output_text.insert(END, "降序排列\n")
        else:
            self.asc_or_desc = 0
            self.output_text.insert(END, "升序排列\n")
        if os.path.exists(self.filename):
            with open(self.filename, 'r', encoding= 'utf-8') as file:
                students = file.readlines()
            students_new = []
            for item in students:
                d = dict(eval(item))
                students_new.append(d)
        else:
            return

        # 排序方式
        asc_or_desc = self.asc_or_desc
        if asc_or_desc == 0:
            asc_or_desc_bool = False
        elif asc_or_desc == 1:
            asc_or_desc_bool = True

        mode = self.sort_mode.get()
        if mode == '1':
            students_new.sort(key=lambda x : int(x['english']), reverse=asc_or_desc_bool)
            # x 代表列表students_new中的项
        elif mode == '2':
            students_new.sort(key=lambda x: int(x['python']), reverse=asc_or_desc_bool)
        elif mode == '3':
            students_new.sort(key=lambda x: int(x['java']), reverse=asc_or_desc_bool)
        elif mode == '4':
            students_new.sort(key=lambda x: int(x['english']) + int(x['python']) + int(x['java']), reverse=asc_or_desc_bool)
        self.show_query(students_new)

    def total(self):
        #统计学生总数
        self.output_text.see(END)
        if os.path.exists(self.filename):
            with open(self.filename, 'r', encoding='utf-8') as file:
                students = file.readlines()
                if students:
                    self.output_text.insert(END, f"总共有{len(students)}名学生 \n")
                else:
                    self.output_text.insert(END, "无学生信息\n")
                    #print("无学生信息")
        else:
            self.output_text.insert(END, "无学生信息\n")


    def show(self):
        self.output_text.see(END)
        #self.output_text.delete("1.0", END)
        student_query = []
        if os.path.exists(self.filename):
            with open(self.filename, 'r', encoding='utf-8') as file:
                student = file.readlines()
                for item in student:
                    d = dict(eval(item))
                    student_query.append(d)
            self.show_query(student_query)
            # 清空列表
            student_query.clear()
        else:
            self.output_text.insert(END, "无学生信息\n")
            return


def gui_start():
    init_window = Tk()              #实例化出一个父窗口
    ZMJ_PORTAL = MY_GUI(init_window)
    # 设置根窗口默认属性
    ZMJ_PORTAL.set_init_window()

    init_window.mainloop()          #父窗口进入事件循环,可以理解为保持窗口运行,否则界面不展示


gui_start()

03.结果展示

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿木wh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值