【Python课程设计】学生成绩管理系统
建立一个单机版有GUI界面的的学生成绩系统,能从文件(或数据库)中读写数据,并具有以下功能。 (1) 能输入并显示学生信息,并生成有关报表文件; (2) 能将学生信息存储在数据库中, (3) 能从数据库中读出学生信息; (4) 能对学生信息进行增、删、改、查; (5) 能计算学生的总分和各门功课的平均分; (6) 能对学生信息进行排序; (7) 能得到排序后的报表文件。 |
一、先创建一个数据库连接文件db.py
我这里用的是MySQL,先得导入一个pymysql的库。
import PyMySQL
class pydb():
def datadb(self,dsql):
# 打开数据库连接
db = PyMySQL.connect("localhost", "root", "root", "pyStudent", charset='utf8')
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# sql = "select * from student"
self.sql = dsql
# 使用execute方法执行SQL语句
cursor.execute(self.sql)
# 使用 fetchone() 方法获取一条数据
data = cursor.fetchall()
#提交事务
db.commit()
# 关闭数据库连接
db.close()
#返回数据
return data
二.创建一个index.py创建界面,再创建一个controller.py来存放控制器
导入tk库以及控制器文件
from tkinter import *
import tkinter.ttk as tk
import tkinter.messagebox # 这个是消息框,对话框的关键
from controller import controller
2.开始画界面
1、设置好界面大小及位置
root = Tk()
root.title("学生成绩管理系统")
# 窗口宽高 英文X
root.geometry('600x500')
# 固定窗口
root.resizable(width=False, height=False)
Label(root, text='学生成绩管理', bg='white', fg='red', font=('宋体', 15)).pack(side=TOP, fill='x')
Label(root, text="学号").place(x=80, y=60)
2、开始画内部样式
Entry(root, width=20, textvariable=u).place(x=115, y=60)
Button(root, text="查询", width=8, command=search).place(x=270, y=55)
Button(root, text="成绩排名", width=8, command=paiMing).place(x=370, y=55)
Button(root, text="生成学生信息报表", width=16, command=baobiao).place(x=450, y=55)
tree = tk.Treeview(root, columns=['1', '2', '3', '4', '5', '6', '7'], show='headings')
tree.place(x=1, y=100)
tree.column('1', width=85, anchor='center')
tree.column('2', width=85, anchor='center')
tree.column('3', width=85, anchor='center')
tree.column('4', width=85, anchor='center')
tree.column('5', width=85, anchor='center')
tree.column('6', width=85, anchor='center')
tree.column('7', width=85, anchor='center')
tree.heading('1', text='学号')
tree.heading('2', text='姓名')
tree.heading('3', text='性别')
tree.heading('4', text='数学')
tree.heading('5', text='英语')
tree.heading('6', text='语文')
tree.heading('7', text='总成绩')
Label(root, text="输入数据").place(x=10, y=340)
Entry(root, width=8, textvariable=a).place(x=75, y=340)
Entry(root, width=8, textvariable=b).place(x=150, y=340)
Entry(root, width=8, textvariable=c).place(x=225, y=340)
Entry(root, width=8, textvariable=d).place(x=300, y=340)
Entry(root, width=8, textvariable=e).place(x=375, y=340)
Entry(root, width=8, textvariable=f).place(x=450, y=340)
Button(root, text="增加数据", width=8, command=zengjia).place(x=520, y=335)
Label(root, text="更改数据").place(x=10, y=380)
Entry(root, width=8,textvariable=g).place(x=75, y=380)
Entry(root, width=8,textvariable=h).place(x=150, y=380)
Entry(root, width=8,textvariable=i).place(x=225, y=380)
Entry(root, width=8,textvariable=j).place(x=300, y=380)
Entry(root, width=8,textvariable=k).place(x=375, y=380)
Entry(root, width=8,textvariable=l).place(x=450, y=380)
Button(root, text="更新", width=8, command=gengxin).place(x=520, y=375)
Button(root, text="删除该学生信息", width=16, command=shanchu).place(x=230, y=435)
root.mainloop()
3、开始添加增删改查的功能
def search(): # 模糊查询
# print(u.get()) #获取输入框中数据
x = tree.get_children() # 清空所有页面数据
for i in x:
tree.delete(i)
data = con.cha(u.get()) # 获取数据
for i in range(len(data)): # 数据输出
tree.insert('', 'end', values=data[i])
def paiMing(): # 分数排名
x = tree.get_children() # 清空所有页面数据
for i in x:
tree.delete(i)
data = con.pai()
for i in range(len(data)): # 数据输出
tree.insert('', 'end', values=data[i])
def zengjia():
s = [a.get(), b.get(), c.get(), d.get(), e.get(), f.get()] # 写入数据源
for i in range(6): # 判断输入是否有空值
if (s[i] == ''):
tkinter.messagebox.showinfo('信息', '信息不完整')
break
else: # python break 无法跳出两层,需用for()....else...来解决
con.zeng(s) # 将数据源交于控制器方法传入数据库
search() # 再次查询
这里就不一一列出来了,大致一样,主界面的功能都是调用控制器里面的方法来完成的。
2.编写控制器
1、导入数据库文件,创建一个类使得再index页面中实现。
import db
class controller():
global dat
dat = db.pydb() # 创建数据库象
2、功能实现,就是通过操纵一些SQL语句,以及数据之间的排序重组。
def cha(self,id): #学号模糊查询
self.id = id
sql = "select * from student where id like '%"+self.id+"%'"
x = list(dat.datadb(sql)) # 获取数据 将数据由元组改为列表
for i in range(len(x)): #每层数据都要改为列表
x[i] = list(x[i])
n = x[i][3]+x[i][4]+x[i][5] #增加总成绩
x[i].append(n)
return x
def pai(self): #成绩排名
sql = "select * from student"
x = list(dat.datadb(sql)) # 获取数据 将数据由元组改为列表
for i in range(len(x)): #每层数据都要改为列表
x[i] = list(x[i])
n = x[i][3]+x[i][4]+x[i][5] #增加总成绩
x[i].append(n)
for i in range(1, len(x)):
# 从第二个元素开始,每次取出一个元素,插入前面的序列使其有序
for j in range(i, 0, -1): #插入排序
if x[j][6] > x[j - 1][6]:
x[j], x[j - 1] = x[j - 1], x[j]
return x
def biao(self):
x = self.pai() #调用排序表
for i in range(len(x)): #将数据全部转为str
for j in range(7):
x[i][j]=str(x[i][j])
t = [["学号","姓名","性别","数学","英语","语文","排名"]]+x #增加表头
f = open("k.txt", "w")
for i in range(len(t)): #换行写入
for j in range(7):
f.write(t[i][j]+' ')
f.write('\n')
print("打印啦")
f.close()
def zeng(self,s):
self.s = s
# try:
sql = "insert into student values(%d,'%s','%s',%d,%d,%d)" % (self.s[0],self.s[1],self.s[2],self.s[3],self.s[4],self.s[5])
dat.datadb(sql) #插入数据
def geng(self,s):
self.s=s
sql="update student set name ='"+self.s[1]+"',sex='"+self.s[2]+"',math="+self.s[3]+",chinese="+self.s[4]+",english="+self.s[5]+" where id ="+self.s[0]
dat.datadb(sql) # 更新数据
def shan(self,n):
self.n = n
sql = "delete from student where id="+self.n
dat.datadb(sql) #删除数据