You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

581 lines
25 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Malfoy's python
#用于实现GUI界面
#import json
import tkinter
from tkinter import *
from tkinter import messagebox
#写账户和密码的全局变量,用于登录,创建一个列表,用于储存信息
account = ''
password = ''
Info = []
try:
with open('studentData.txt','r+',encoding='utf-8')as f: #当没有Studentdata文本时会发生报错走入except中
list = f.readlines()
for item in list:
Info.append(eval(item)) #将字符串利用eval转换为字典储存进列表中
except:
with open('studentData.txt','w+',encoding='utf-8')as f: #由于还未生成Studentdata文件利用w创建一个
pass #由于刚创建文本没有内容所以不需要像上面那样把内容加入到Info中
class Application_login(Frame):
def __init__(self,master = None):
super().__init__(master)
self.master = master
self.font = ('宋体',12)
self.pack()
self.createWidget()
def createWidget(self):
#创建标签
self.lab01 = Label(self,text = '账号: ',font = self.font)
self.lab02 = Label(self,text = '密码: ',font = self.font)
self.lab01.grid(row = 0 , column = 0,sticky=NSEW)
self.lab02.grid(row = 1 , column = 0,sticky=NSEW)
#创建单行文本框
self.account = StringVar()
self.account.set('请输入:管理员/用户')
self.entry01 = Entry(self,textvariable=self.account,width=50,exportselection=False,font = self.font)
self.entry01.grid(row=0,column=1,sticky=NSEW)
self.password = StringVar()
self.password.set('若是管理员,请输入密码(用户可以直接点击登录)')
self.entry02 = Entry(self,textvariable=self.password,width=50,exportselection=False,font = self.font)
self.entry02.grid(row=1,column=1,sticky=NSEW)
#创建功能按钮
self.btn01 = Button(self,text = '登录',command = self.confirm,bg = 'silver' )
self.btn01.grid(row=2,column=0,columnspan=2,sticky=NSEW)
def confirm(self): #用于确认登录者的信息
global account
global password
print('用户输入的账户是: ',self.account.get())
if self.account.get() == '管理员':
if self.password.get() == '' or self.password.get() == '若是管理员,请输入密码(用户可以直接点击登录)':
messagebox.showwarning('警告','您是管理员,还未输入密码')
elif self.password.get() == '123456':
account = self.account.get()
password = self.password.get()
messagebox.showinfo('提示','恭喜您以管理员身份登录成功')
self.login_destroy()
else:
messagebox.showwarning('警告','您以管理员身份登录,密码错误')
elif self.account.get() == '用户':
account = self.account.get()
messagebox.showinfo('提示','恭喜您以用户身份登录')
self.login_destroy()
elif self.account.get() == '请输入:管理员/用户' or self.account.get() == '':
messagebox.showwarning('学生管理系统登录','你还未选择账户是管理员还是用户')
else:
messagebox.showwarning('学生管理系统登录','你选择的账户不符合规定')
def login_destroy(self):
login_gui.destroy()
login_gui = Tk()
login_gui.title('<<学生管理系统登录界面>>')
login_gui.geometry('500x100+500+200')
app_login = Application_login(master = login_gui)
login_gui.mainloop()
class Application(Frame):
def __init__(self,master = None):
super().__init__(master)
self.master = master
self.font = ("宋体", 12)
self.student_list = []
self.grid(row=0,column=0,columnspan=6)
self.createWidget()
def createWidget(self):
self.btn01 = Button(self,text = '添 加 学 生 信 息', bg = 'silver', font = ('Arial', 12), command = self.Add_window, width = 20)
self.btn02 = Button(self,text = '删 除 学 生 信 息', bg = 'silver', font = ('Arial', 12), command = self.Del_window, width = 20)
self.btn03 = Button(self,text = '修 改 学 生 信 息', bg = 'silver', font = ('Arial', 12), command = self.Mod_window, width = 20)
self.btn04 = Button(self,text = '查 询 学 生 信 息', bg = 'silver', font = ('Arial', 12), command = self.Ser_window, width = 20)
self.btn05 = Button(self,text = '显 示 学 生 信 息', bg = 'silver', font = ('Arial', 12), command = self.Show_window, width = 20)
self.btn06 = Button(self,text = '退 出 学 生 管 理 系 统', bg = 'silver', font = ('Arial', 12), command = self.Exit_window, width = 20)
self.btn01.grid(row=0,column=0,sticky=NSEW,pady = 15)
self.btn02.grid(row=1,column=0,sticky=NSEW,pady = 15)
self.btn03.grid(row=2,column=0,sticky=NSEW,pady = 15)
self.btn04.grid(row=3,column=0,sticky=NSEW,pady = 15)
self.btn05.grid(row=4,column=0,sticky=NSEW,pady = 15)
self.btn06.grid(row=5,column=0,sticky=NSEW,pady = 15)
self.result = StringVar()
self.result.set('">>>欢迎使用学生信息管理系统<<<\n Edition: V1.1 \n @Author: Marshal\nComplete Time: 2022/10/14"')
self.Show_result = Label(self, bg="white", fg="black", font=self.font, bd='0', anchor='nw', textvariable=self.result,width=100)
self.Show_result.grid(row=0,column=1,rowspan=6,sticky=NSEW)
def Add_window(self):
#窗口创建
print('打开窗口: 添加学生信息')
self.add_window = tkinter.Toplevel()
self.add_window.title('添加学生信息')
self.add_window.geometry('400x350+520+300')
#学号
self.ID =StringVar()
self.lab_ID = Label(self.add_window,text = '学号6位',font = self.font)
self.entry_ID = Entry(self.add_window,textvariable=self.ID,width=30)
self.lab_ID.grid(row=0,column=0,sticky=E,pady = 15)
self.entry_ID.grid(row=0,column=1,columnspan=5,sticky=EW)
#姓名
self.name =StringVar()
self.lab_name = Label(self.add_window,text = ' 姓名 ',font = self.font)
self.entry_name = Entry(self.add_window,textvariable=self.name,width=30)
self.lab_name.grid(row=1,column=0,sticky=E,pady = 15)
self.entry_name.grid(row=1,column=1,columnspan=5,sticky=EW)
#专业
self.major =StringVar()
self.lab_major = Label(self.add_window,text = ' 专业 ',font = self.font)
self.entry_major = Entry(self.add_window,textvariable=self.major,width=30)
self.lab_major.grid(row=2,column=0,sticky=E,pady = 15)
self.entry_major.grid(row=2,column=1,columnspan=5,sticky=EW)
#年龄
self.age =StringVar()
self.lab_age = Label(self.add_window,text = ' 年龄 ',font = self.font)
self.entry_age = Entry(self.add_window,textvariable=self.age,width=30)
self.lab_age.grid(row=3,column=0,sticky=E,pady = 15)
self.entry_age.grid(row=3,column=1,columnspan=5,sticky=EW)
#班级
self._class =StringVar()
self.lab__class = Label(self.add_window,text = '班级(序号):',font = self.font)
self.entry__class = Entry(self.add_window,textvariable=self._class,width=30)
self.lab__class.grid(row=4,column=0,sticky=E,pady = 15)
self.entry__class.grid(row=4,column=1,columnspan=5,sticky=EW)
#电话
self.phone =StringVar()
self.lab_phone = Label(self.add_window,text = ' 电话 ',font = self.font)
self.entry_phone = Entry(self.add_window,textvariable=self.phone,width=30)
self.lab_phone.grid(row=5,column=0,sticky=E,pady = 15)
self.entry_phone.grid(row=5,column=1,columnspan=5,sticky=EW)
#确认按钮
self.add_confirm = Button(self.add_window,text = '确认', bg = 'silver',font = self.font,command = lambda: self.student_add(self.ID.get(),self.name.get(),self.major.get(),self.age.get(),self._class.get(),self.phone.get()))
self.add_confirm.grid(row=7,column=2,sticky=NSEW)
#取消按钮
self.add_concel = Button(self.add_window,text = '取消', bg = 'silver',font = self.font,command = lambda :self.concel(self.add_window))
self.add_concel.grid(row=7,column=4,sticky=NSEW)
self.add_window.mainloop()
def Del_window(self):
print('打开窗口: 删除学生信息')
# 窗口创建
self.del_window = tkinter.Toplevel()
self.del_window.title('删除学生信息')
self.del_window.geometry('450x110+550+400')
#提示标签
self.lab_del_tip = Label(self.del_window,text = '>>>请先通过"查询学生信息"查询待删除学生的学号<<<',bg = 'white',font=self.font)
self.lab_del_tip.grid(row=0,column=0,columnspan=5,sticky=NSEW)
#删除学号
self.del_ID =StringVar()
self.lab_del_ID = Label(self.del_window,text = '学号6位',font = self.font)
self.entry_del_ID = Entry(self.del_window,textvariable=self.del_ID,width=30)
self.lab_del_ID.grid(row=1,column=0,sticky=E,pady = 15)
self.entry_del_ID.grid(row=1,column=1,columnspan=4,sticky=EW)
#确认按钮
self.del_confirm = Button(self.del_window,text = '确认', bg = 'silver',font = self.font,command = lambda :self.student_del(self.del_ID.get()))
self.del_confirm.grid(row=2,column=1)
#取消按钮
self.del_concel = Button(self.del_window,text = '取消', bg = 'silver',font = self.font,command = lambda :self.concel(self.del_window))
self.del_concel.grid(row=2,column=2)
self.del_window.mainloop()
def Mod_window(self):
# 窗口创建
print('打开窗口:修改学生信息')
self.mod_window = tkinter.Toplevel()
self.mod_window.title('修改学生信息')
self.mod_window.geometry('470x110+550+400')
#提示标签
self.lab_mod_tip = Label(self.mod_window,text = '>>>请先通过"查询学生信息"查询待修改信息学生的学号<<<',bg = 'white',font=self.font)
self.lab_mod_tip.grid(row=0,column=0,columnspan=5,sticky=NSEW)
#查询学号
self.mod_ID =StringVar()
self.lab_mod_ID = Label(self.mod_window,text = '学号6位',font = self.font)
self.entry_mod_ID = Entry(self.mod_window,textvariable=self.mod_ID,width=30)
self.lab_mod_ID.grid(row=1,column=0,sticky=E,pady = 15)
self.entry_mod_ID.grid(row=1,column=1,columnspan=4,sticky=EW)
#确认按钮
self.mod_confirm = Button(self.mod_window,text = '确认', bg = 'silver',font = self.font,command = lambda :self.student_mod(self.mod_ID.get()))
self.mod_confirm.grid(row=2,column=1)
#取消按钮
self.mod_concel = Button(self.mod_window,text = '取消', bg = 'silver',font = self.font,command = lambda :self.concel(self.mod_window))
self.mod_concel.grid(row=2,column=2)
self.mod_window.mainloop()
def Ser_window(self):
# 窗口创建
print('打开窗口: 查询学生信息')
self.ser_window = tkinter.Toplevel()
self.ser_window.title('查询学生信息')
self.ser_window.geometry('400x400+600+250')
#提示标签
self.lab_mod_tip = Label(self.ser_window,text = '>>>输入学号/姓名,点击确认后开始查询<<<\n<<当学号和姓名同时存在时,仅使用学号查找>>',bg = 'white',font=self.font)
self.lab_mod_tip.grid(row=6,column=0,columnspan=7,sticky=NSEW)
#学号
self.ser_ID =StringVar()
self.lab_ser_ID = Label(self.ser_window,text = '学号6位',font = self.font)
self.entry_ser_ID = Entry(self.ser_window,textvariable=self.ser_ID,width=30)
self.lab_ser_ID.grid(row=0,column=0,sticky=E,pady = 15)
self.entry_ser_ID.grid(row=0,column=1,columnspan=5,sticky=EW)
#姓名
self.ser_name =StringVar()
self.lab_ser_name = Label(self.ser_window,text = ' 姓名 ',font = self.font)
self.entry_ser_name = Entry(self.ser_window,textvariable=self.ser_name,width=30)
self.lab_ser_name.grid(row=1,column=0,sticky=E,pady = 15)
self.entry_ser_name.grid(row=1,column=1,columnspan=5,sticky=EW)
#专业
self.ser_major =StringVar()
self.lab_ser_major = Label(self.ser_window,text = ' 专业 ',font = self.font)
self.entry_ser_major = Entry(self.ser_window,textvariable=self.ser_major,width=30)
self.lab_ser_major.grid(row=2,column=0,sticky=E,pady = 15)
self.entry_ser_major.grid(row=2,column=1,columnspan=5,sticky=EW)
#年龄
self.ser_age =StringVar()
self.lab_ser_age = Label(self.ser_window,text = ' 年龄 ',font = self.font)
self.entry_ser_age = Entry(self.ser_window,textvariable=self.ser_age,width=30)
self.lab_ser_age.grid(row=3,column=0,sticky=E,pady = 15)
self.entry_ser_age.grid(row=3,column=1,columnspan=5,sticky=EW)
#班级
self.ser__class =StringVar()
self.lab_ser__class = Label(self.ser_window,text = '班级(序号):',font = self.font)
self.entry_ser__class = Entry(self.ser_window,textvariable=self.ser__class,width=30)
self.lab_ser__class.grid(row=4,column=0,sticky=E,pady = 15)
self.entry_ser__class.grid(row=4,column=1,columnspan=5,sticky=EW)
#电话
self.ser_phone =StringVar()
self.lab_ser_phone = Label(self.ser_window,text = ' 电话 ',font = self.font)
self.entry_ser_phone = Entry(self.ser_window,textvariable=self.ser_phone,width=30)
self.lab_ser_phone.grid(row=5,column=0,sticky=E,pady = 15)
self.entry_ser_phone.grid(row=5,column=1,columnspan=5,sticky=EW)
#确认按钮
self.ser_confirm = Button(self.ser_window,text = '确认', bg = 'silver',font = self.font,command = lambda :self.student_ser(self.ser_ID.get(),self.ser_name.get()))
self.ser_confirm.grid(row=7,column=2,sticky=NSEW)
#取消按钮
self.ser_concel = Button(self.ser_window,text = '取消', bg = 'silver',font = self.font,command = lambda :self.concel(self.ser_window))
self.ser_concel.grid(row=7,column=4,sticky=NSEW)
self.ser_window.mainloop()
def Show_window(self): #用于实现信息的展示
global Info
if len(Info) == 0:
messagebox.showinfo('提示','暂无学生信息')
self.result.set('>>>>暂无学生信息<<<<')
return
if account == '管理员':
student_content = ("{:<15}".format("学号") +
"{:<15}".format("姓名") +
"{:<15}".format("专业") +
"{:<15}".format("年龄") +
"{:<15}".format("班级") +
"{:<15}".format("电话号码") +
"\n")
for i in Info:
student_content += ("{:<15}".format(i['ID']) +
"{:<15}".format(i['Name']) +
"{:<15}".format(i['Major']) +
"{:<15}".format(i['Age']) +
"{:<15}".format(i['Class']) +
"{:<15}".format(i['Telephone']) +
"\n")
self.result.set(student_content)
messagebox.showinfo('提示','显示学生信息成功')
elif account == '用户':
messagebox.showinfo('提示','由于您是用户,仅展示一部分学生信息')
student_content = ("{:<15}".format("学号") +
"{:<15}".format("姓名") +
"{:<15}".format("专业") +
"{:<15}".format("班级") +
"\n")
for i in Info:
student_content += ("{:<15}".format(i['ID']) +
"{:<15}".format(i['Name']) +
"{:<15}".format(i['Major']) +
"{:<15}".format(i['Class']) +
"\n")
self.result.set(student_content)
messagebox.showinfo('提示', '显示学生信息成功')
def Exit_window(self): #用于实现退出窗口
answer = messagebox.askyesno('退出学生管理系统','您确定退出学生管理系统吗?')
print('是否退出学生管理系统:',answer)
if answer == True: #传回的是bool值不是字符串,所以不用加引号
messagebox.showinfo('学生管理系统','欢迎下次使用')
root.destroy()
elif answer == False:
return
def concel(self,window):#用于关闭窗口
print('关闭窗口')
window.destroy()
def student_add(self,ID,name,major,age,_class,phone): #用于添加学生信息
global Info
if not self.is_ID(ID):
self.Tip_Add_ID()
return
if not self.is_Age(age):
self.Tip_Add_Age()
return
if not self.is_Class(_class):
self.Tip_Add_Class()
return
if not self.is_Telephone(phone):
self.Tip_Add_Telephone()
return
for i in Info:
if i['ID'] == ID:
self.Tip_Add_ID_Repeat()
return
if account == '管理员':
Info_dict = {'ID': ID, 'Name': name, 'Major': major, 'Age': age
, 'Class': _class, 'Telephone': phone}
print('添加的学生信息是:', Info_dict)
Info.append(Info_dict)
with open('studentData.txt','w',encoding='utf-8')as f:
for item in Info:
f.write(str(item)+'\n')
self.Tip_Add()
self.add_window.destroy()
self.Show_window()
else:
messagebox.showwarning('警告','您不是管理员,无法添加学生信息')
def student_del(self,get_ID): #用于删除学生信息
global Info
ID = get_ID
flag = 0
if not self.is_ID(ID):
self.Tip_Add_ID()
return
if account == '管理员':
for i in Info:
if i['ID'] == ID:
Info.remove(i)
flag = 1
break
if flag == 1:
for i in Info:
with open('studentData.txt','w',encoding='utf-8')as f:
f.write(str(i)+'\n')
self.Tip_Del()
self.Show_window()
else:
self.Tip_Del_ID_None()
else:
messagebox.showwarning('警告','您不是管理员,无法删除学生信息')
def student_mod(self,get_ID): #用于更改学生信息
global Info
ID = get_ID
if not self.is_ID(ID):
self.Tip_Add_ID()
return
if account == '管理员':
for i in Info:
if i['ID'] == ID:
self.student_del(ID)
messagebox.showinfo('提示','要修改的信息已删除,请输入修改后的信息')
self.Add_window()
break
else:
self.Tip_Del_ID_None()
else:
messagebox.showwarning('警告','您不是管理员,无法修改学生信息')
def student_ser(self,get_ID,get_Name): #用于查询学生信息
global Info
ID = get_ID
Name = get_Name
flag = 0
if ID != '': #当学号不为空时(同时包含了学号和姓名)
if not self.is_ID(ID): #判断学号符不符合规定
self.Tip_Add_ID()
return
if account == '管理员':
for i in Info:
if i['ID'] == ID:
self.ser_ID.set(i['ID'])
self.ser_name.set(i['Name'])
self.ser_major.set(i['Major'])
self.ser_age.set(i['Age'])
self.ser__class.set(i['Class'])
self.ser_phone.set(i['Telephone'])
flag = 1
break
if flag == 1:
self.Tip_Search()
else:
self.Tip_Search_None()
elif account == '用户':
messagebox.showinfo('提示', '由于您是用户,仅展示一部分内容')
for i in Info:
if i['ID'] == ID:
self.ser_ID.set(i['ID'])
self.ser_name.set(i['Name'])
self.ser_major.set(i['Major'])
self.ser__class.set(i['Class'])
flag = 1
break
if flag == 1:
self.Tip_Search()
else:
self.Tip_Search_None()
elif ID == '' and Name != '': #当没有学号,仅存在名字时
if account == '管理员':
for i in Info:
if i['Name'] == Name:
self.ser_ID.set(i['ID'])
self.ser_name.set(i['Name'])
self.ser_major.set(i['Major'])
self.ser_age.set(i['Age'])
self.ser__class.set(i['Class'])
self.ser_phone.set(i['Telephone'])
flag = 1
if flag == 1:
self.Tip_Search()
else:
self.Tip_Search_None()
elif account == '用户':
messagebox.showinfo('提示', '由于您是用户,仅展示一部分内容')
for i in Info:
if i['Name'] == Name:
self.ser_ID.set(i['ID'])
self.ser_name.set(i['Name'])
self.ser_major.set(i['Major'])
self.ser__class.set(i['Class'])
flag = 1
break
if flag == 1:
self.Tip_Search()
else:
self.Tip_Search_None()
#用于判断是否符合要求
# 定于一个方法,用于检查学号是否规范
def is_ID(self,ID):
return len(ID) == 6 and ID.isdigit()
# 定于一个方法,用于检查年龄是否规范
def is_Age(self,age):
return age.isdigit() and 17 <= int(age) and int(age) <= 25
# 定于一个方法,用于检查班级是否规范
def is_Class(self,_class):
return _class.isdigit() and int(_class) > 0
# 定于一个方法,用于检查电话是否规范
def is_Telephone(self,phone):
return len(phone) == 11 and phone.isdigit()
# 提示信息
def Tip_Add(self):
messagebox.showinfo("提示信息", "添加成功")
def Tip_Search(self):
messagebox.showinfo("提示信息", "查询成功")
def Tip_Del(self):
messagebox.showinfo("提示信息", "删除成功")
def Tip_Mod(self):
messagebox.showinfo("提示信息", "修改成功")
def Tip_Add_ID_Repeat(self):
messagebox.showinfo("提示信息", "此学号已经存在,请勿重复添加!")
def Tip_Del_ID_None(self):
messagebox.showinfo("提示信息", "此学号不存在,请重新输入!")
def Tip_Search_None(self):
messagebox.showinfo("提示信息", "未查询到有关学生信息!")
def Tip_Add_ID(self):
messagebox.showinfo("提示信息", "学号格式有误,请重新输入!")
def Tip_Add_Age(self):
messagebox.showinfo("提示信息", "年龄格式有误,请重新输入!(17-25岁)")
def Tip_Add_Class(self):
messagebox.showinfo("提示信息", "班级格式有误,请重新输入!")
def Tip_Add_Telephone(self):
messagebox.showinfo("提示信息", "电话格式有误,请重新输入!(11位电话号码)")
if account == '管理员' or account == '用户':
root = Tk()
root.title('<<<学生管理系统>>>')
root.geometry('1050x375+500+200')
app = Application(master = root)
root.mainloop()