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