import tkinter as tk
 import tkinter.messagebox
 import csv
 import sys
 def getgrades():
     root=tk.Tk()
     root.title("查询学生成绩")#新窗口的标题
     root.geometry('300x400')#设置新窗口的大小
     root.resizable(width=0,height=0)
     tk.Label(root, 
              text="姓名").grid(row=0,column=0,sticky=tk.W)
     tk.Label(root, 
              text="学号").grid(row=1,column=0,sticky=tk.W)
     e1= tk.Entry(root)#创建文本框,用于输入姓名
     e2= tk.Entry(root)#创建文本框,用于输入学号
     e1.grid(row=0, column=1,columnspan=3)
     e2.grid(row=1, column=1,columnspan=3)
     tk.Button(root, 
               text='查询学生成绩', command=lambda:check(e1,e2,text)).grid(row=2,column=0,sticky=tk.E)
     #放置一个按钮,里接了查询成绩的方法check()
     text=tk.Text(root,height=20,width=40)#放置一个文本框来对查询结果进行反应
     text.grid(row=3,column=0,columnspan=5)def check(e1,e2,text):
     for i in data:
         if i[0]==e1.get() and i[1]==e2.get():#遍历数组并检验是否存在该学生
             if i[2]=="" and i[3]=="":#如果两科成绩都不存在则认为缺考
                 text.delete('1.0', tk.END)
                 text.insert(tk.END,'该学生成绩未输入或该学生缺考') 
             else:
                 text.delete('1.0', tk.END)
                 text.insert(tk.END,'高数成绩为:{}\n英语成绩为:{}'.format(i[2],i[3]))            
             break
     else:#这个else用于对for的补充,若上面的if语句无法实现则实现下面语句
         text.delete('1.0', tk.END)
         text.insert(tk.END,'该学生不存在!')            def altermath():
     root=tk.Tk()
     root.title("修改学生成绩")
     root.geometry('300x400')#设置新窗口的大小
     root.resizable(width=0,height=0)
     tk.Label(root, 
              text="姓名").grid(row=0,column=0,sticky=tk.W)
     tk.Label(root, 
              text="学号").grid(row=1,column=0,sticky=tk.W)
     tk.Label(root, 
              text="高数").grid(row=2,column=0,sticky=tk.W) 
     e1= tk.Entry(root)#创建文本框,用于输入姓名
     e2= tk.Entry(root)#创建文本框,用于输入学号
     e3= tk.Entry(root)#创建文本框,用于输入高数成绩
     e1.grid(row=0, column=1,columnspan=3)
     e2.grid(row=1, column=1,columnspan=3)
     e3.grid(row=2, column=1,columnspan=3)
     tk.Button(root, 
               text='修改学生成绩', command=lambda:alter1(e1,e2,e3,text)).grid(row=4,column=0,sticky=tk.E)
     #放置按钮,里面接了一个修改的方法 alter1()
     text=tk.Text(root,height=20,width=40)
     text.grid(row=5,column=0,columnspan=5)def alter1(e1,e2,e3,text):
     n=0#定义一个变量来判断学生在数组里的位置
     for i in data:
         if i[0]==e1.get() and i[1]==e2.get():#遍历数组并检验是否存在该学生
             data[n][2]=e3.get()
             text.delete('1.0', tk.END)#删除文本框的内容以便新内容的呈现
             text.insert(tk.END,'修改成功')
             data.insert(0,title)#先加入姓名,学号等标题防止csv文件里标题丢失
             with open("studata.csv","w",newline='') as csvfile:
                 #用with采用写的方式打开文件,同时用csvfile保存
                 writer = csv.writer(csvfile)
                 writer.writerows(data)#将用户输入的数据加入到csv文件里
             csvfile.close()#关闭文件以减少内存的消耗
             data.pop(0)#删除上文中的标题
             break
         n+=1
     else:
         text.delete('1.0', tk.END)#重置文本框
         text.insert(tk.END,'修改失败,该学生不存在!')def altereng():
     root=tk.Tk()
     root.title("修改学生成绩")
     root.geometry('300x400')
     root.resizable(width=0,height=0)
     tk.Label(root, 
              text="姓名").grid(row=0,column=0,sticky=tk.W)
     tk.Label(root, 
              text="学号").grid(row=1,column=0,sticky=tk.W)
     tk.Label(root, 
              text="英语").grid(row=2,column=0,sticky=tk.W) 
     e1= tk.Entry(root)#创建文本框,用于输入姓名
     e2= tk.Entry(root)#创建文本框,用于输入学号
     e3= tk.Entry(root)#创建文本框,用于输入英语成绩
     e1.grid(row=0, column=1,columnspan=3)
     e2.grid(row=1, column=1,columnspan=3)
     e3.grid(row=2, column=1,columnspan=3)
     tk.Button(root, 
               text='修改学生成绩', command=lambda:alter2(e1,e2,e3,text)).grid(row=4,column=0,sticky=tk.E)
     #按钮里面接了alter2()方法
     text=tk.Text(root,height=20,width=40)#用于提醒用户是否修改成功
     text.grid(row=5,column=0,columnspan=5)def alter2(e1,e2,e3,text):
     n=0#定义一个变量来判断学生在数组里的位置
     for i in data:
         if i[0]==e1.get() and i[1]==e2.get():#遍历数组并检验是否存在该学生
             data[n][3]=e3.get()
             text.delete('1.0', tk.END)#清空文本框
             text.insert(tk.END,'修改成功')
             data.insert(0,title)
             with open("studata.csv","w",newline='') as csvfile:
                 #用with采用写的方式打开文件,同时用csvfile保存
                 writer = csv.writer(csvfile)
                 writer.writerows(data)#将用户输入的数据加入到csv文件里
             csvfile.close()#关闭文件减少内存
             data.pop(0)
             break
         n+=1
     else:
         text.delete('1.0', tk.END)
         text.insert(tk.END,'修改失败,该学生不存在!')def inputmath():
     root=tk.Tk()
     root.title("新增学生成绩")
     root.geometry('300x400')
     root.resizable(width=0,height=0)
     tk.Label(root, 
              text="姓名").grid(row=0,column=0,sticky=tk.W)
     tk.Label(root, 
              text="学号").grid(row=1,column=0,sticky=tk.W)
     tk.Label(root, 
              text="高数").grid(row=2,column=0,sticky=tk.W)  
     e1= tk.Entry(root)#创建文本框,用于输入姓名
     e2= tk.Entry(root)#创建文本框,用于输入学号
     e3= tk.Entry(root)#创建文本框,用于输入高数成绩
     e1.grid(row=0, column=1,columnspan=3)
     e2.grid(row=1, column=1,columnspan=3)
     e3.grid(row=2, column=1,columnspan=3)
     tk.Button(root, 
               text='添加学生成绩', command=lambda:input1(e1,e2,e3,text)).grid(row=4,column=0,sticky=tk.E)
     text=tk.Text(root,height=20,width=40)
     text.grid(row=5,column=0,columnspan=5)def input1(e1,e2,e3,text):
     for i in data:
         if i[0]==e1.get() and i[1]==e2.get():#遍历数组并检验是否存在该学生
             text.delete('1.0', tk.END)
             text.insert(tk.END,'该学生已存在,请确认是否输入错误')
             break
     else:
         ls=list()#新建一个数组储存姓名学号成绩
         ls.append(e1.get())#依次添加数据
         ls.append(e2.get())
         ls.append(e3.get())
         data.append(ls)#以数组的形式加入到数组data里面
         data.insert(0,title)
         with open("studata.csv","w",newline='') as csvfile:
             #用with采用写的方式打开文件,同时用csvfile保存
             writer = csv.writer(csvfile)
             writer.writerows(data)#将用户输入的数据加入到csv文件里
         csvfile.close()#关闭文件
         data.pop(0)#删除标题
         text.delete('1.0', tk.END)
         text.insert(tk.END,'添加成功!')def inputeng():
     root=tk.Tk()
     root.title("新增学生成绩")
     root.geometry('300x400')
     root.resizable(width=0,height=0)
     tk.Label(root, 
              text="姓名").grid(row=0,column=0,sticky=tk.W)
     tk.Label(root, 
              text="学号").grid(row=1,column=0,sticky=tk.W)
     tk.Label(root, 
              text="英语").grid(row=2,column=0,sticky=tk.W)  
     e1= tk.Entry(root)#创建文本框,用于输入姓名
     e2= tk.Entry(root)#创建文本框,用于输入学号
     e3= tk.Entry(root)#创建文本框,用于输入英语成绩
     e1.grid(row=0, column=1,columnspan=3)
     e2.grid(row=1, column=1,columnspan=3)
     e3.grid(row=2, column=1,columnspan=3)
     tk.Button(root, 
               text='添加学生成绩', command=lambda:input2(e1,e2,e3,text)).grid(row=4,column=0,sticky=tk.E)
     text=tk.Text(root,height=20,width=40)
     text.grid(row=5,column=0,columnspan=5)def input2(e1,e2,e3,text):
     for i in data:
         if i[0]==e1.get() and i[1]==e2.get():#遍历数组并检验是否存在该学生
             text.delete('1.0', tk.END)
             text.insert(tk.END,'该学生已存在,请确认是否输入错误')
             break
     else:
         ls=list()#新建一个数组储存姓名学号成绩
         ls.append(e1.get())#依次添加数据
         ls.append(e2.get())
         ls.append('')
         ls.append(e3.get())
         data.append(ls)#以数组的形式加入到数组data里面
         data.insert(0,title)
         with open("studata.csv","w",newline='') as csvfile:
             #用with采用写的方式打开文件,同时用csvfile保存
             writer = csv.writer(csvfile)
             writer.writerows(data)#将用户输入的数据加入到csv文件里
         csvfile.close()#关闭文件节省内存
         data.pop(0)
         text.delete('1.0', tk.END)
         text.insert(tk.END,'添加成功!') #在文本框中显示结果           
 def nopass():
     math=list()#新建高数挂科数组
     eng=list()#新建英语挂科数组
     text.delete('1.0', tk.END)
     for i in data:
         if i[2]!="" and i[3]!="":#将缺考学生排除在外
             math1=list()
             eng1=list()
             if eval(i[2])<60:#对高数成绩进行判断
                 math1.append(i[0])
                 math1.append(i[1])
                 math.append(math1)
             if eval(i[3])<60:#对英语成绩进行判断
                 eng1.append(i[0])
                 eng1.append(i[1])
                 eng.append(eng1)
     text.insert(tk.END,'高数不及格名单为:\n')
     for i in math:#依次打出姓名和学号
         text.insert(tk.END,str(i)+"\n")
     text.insert(tk.END,'英语不及格名单为:\n')
     for i in eng:#依次打出姓名和学号
         text.insert(tk.END,str(i)+'\n')
     
 def close():#对学生成绩系统的退出
     ret= tkinter.messagebox.askyesnocancel(message="真的退出吗?")#对用户进行询问
     if ret==True:
         window.destroy()#对主窗口的销毁
         
 def maav():
     sum=0
     n=0#用于统计有效成绩人数
     for i in data:
         if i[2]!='':#只计算有效成绩
             sum+=eval(i[2])
             n+=1
     sum=sum/n#有效成绩除以有效人数
     text.delete('1.0',tk.END)
     text.insert(tk.END,'高数平均分为:{:.3f}'.format(sum))def enav():
     sum=0
     n=0#用于统计有效成绩人数
     for i in data:
         if i[3]!='':#只计算有效成绩
             sum+=eval(i[3])
             n+=1
     sum=sum/n#有效成绩除以有效人数
     text.delete('1.0',tk.END)
     text.insert(tk.END,'英语平均分为:{:.3f}'.format(sum))
 window=tk.Tk()
 window.title('学生成绩系统')
 a=window.winfo_screenwidth()#获取屏幕的宽
 b=window.winfo_screenheight()#获取屏幕的高
 window.geometry('{}x{}'.format(a//3,b//2))
 window.resizable(width=0,height=0)#窗口的排序方法

f=open('studata.csv','a+')#以'a+'的方式打开文件,先确定文件是否存在,不存在则创建
f.seek(0)#将光标移到文件最前面以便数据获取
data=[]#新建一个数组用于储存文件里的数据

for line in f:#将数据导入数组
     line=line.replace("\n",'')
     data.append(line.split(','))if len(data)==0:#对文件进行判断,看文件是否为新建空白文档
     data.append(['姓名','学号','高数','英语'])#如果文件不存在则创建文件并输入标题
     with open("studata.csv","w",newline='') as csvfile:
         #用with采用写的方式打开文件,同时用csvfile保存
         writer = csv.writer(csvfile)
         writer.writerows(data)#将用户输入的数据加入到csv文件里
 title=data[0]
 data.pop(0)#删除标题只剩数据利于剩下的数据统计    tk.Label(window,
          text='欢迎进入学生成绩系统').grid(row=0,column=1,sticky=tk.W)
 tk.Label(window,
          text='请选择你要进行的操作').grid(row=1,column=1,sticky=tk.W)
 tk.Button(window, 
           text='查询学生成绩', command=getgrades).grid(row=2,column=1,sticky=tk.W)
 tk.Button(window, 
           text='修改学生高数成绩', command=altermath).grid(row=2,column=2,sticky=tk.W)
 tk.Button(window, 
           text='修改学生英语成绩', command=altereng).grid(row=3,column=1,sticky=tk.W)
 tk.Button(window, 
           text='加入学生高数成绩', command=input).grid(row=3,column=2,sticky=tk.W)
 tk.Button(window, 
           text='加入学生英语成绩', command=input).grid(row=4,column=1,sticky=tk.W)
 tk.Button(window, 
           text='高数平均分', command=maav).grid(row=4,column=2,sticky=tk.W)
 tk.Button(window, 
           text='英语平均分', command=enav).grid(row=5,column=1,sticky=tk.W)
 tk.Button(window, 
           text='学生成绩不合格名单', command=nopass).grid(row=5,column=2,sticky=tk.W)
 tk.Button(window, 
           text='退出系统', command=close).grid(row=6,column=2,sticky=tk.W)
 text=tk.Text(window,height=10,width=40)
 text.grid(row=7,column=1,columnspan=1)
 window.mainloop()