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