本题为数据库的一项课程作业,结合Python和Sql实现了学生选课管理系统,感觉反正都写了,就给大家做一下参考吧,可能会对Tkinter的应用有一些帮助,注释有些乱,凑活看吧。
刚开始用Tkinter的时候踩了很多坑,虽然都说Tkinter简单易上手,但我感觉做不出来太高端的东西...如果时间比较充裕倒是可以学一下QT,时间短想突击一下还是可以用一下Tkinter的
P.S:突然感觉php也比这个强一点哈哈
代码分为menu.py和main.py两个部分,基本功能实现都在menu里,main中实现了调用。
这次课设是我第一次学习用Python编程,之前一直都是用的C++的,所以很多地方对于Python的应用并不是很熟悉,都是简简单单照葫芦画瓢能用就行了,并没有深究,细看的话还有很多地方可以优化的。不过笔者还是比较懒的,最后能用就没管那么多了hhh
话不多说,下面附上代码。
友情提示:代码中的pymysql.connect中的用户名、密码、数据库名我都没改,如果想应用在自己电脑上的话需要根据自己MySql的账号密码对其进行修改,数据库没有可以仿照着操作中的名称建立数据库
menu.py:
import tkinter
from tkinter import *
from tkinter import ttk
from tkinter.messagebox import showinfo, showerror, askyesno
from PIL import Image, ImageTk
import pymysql
# 选课的我想设置一个课程冲突提醒
# GUI界面布局:
# 亟待解决的问题:showerror报错时总会跟着弹出主窗口 #解决了
class menu(object):
def __init__(self, master, handle, user_name=None): # master参数指的是父容器
self.window = master
self.user_handle = handle
self.user_name = user_name
self.window.iconphoto(False, ImageTk.PhotoImage(file='icon2.png'))
self.window.resizable(False, False) # 不可更改大小
self.sid = StringVar() # 学生身份证
self.name = StringVar() # 姓名
self.sex = StringVar() # 性别
self.dept_name = StringVar() # 单位(院系名)
self.age = StringVar() # 年龄
# stu_reward添加
self.type = StringVar()
self.info = StringVar()
# dept_info添加
self.major_name = StringVar()
# course
self.cid = StringVar()
self.course_name = StringVar()
self.teacher = StringVar()
self.time = StringVar()
self.classroom = StringVar()
self.credit = StringVar()
# exam添加
self.score = StringVar()
# self.window.geometry('500x400')
self.handle = False # 设置句柄,为真时代表已经有一个窗口了,禁止再打开新窗口
self.handle_2 = False # 代表修改院系信息的那个窗口
self.createWindow()
def get_image(self, filename, width, height):
im = Image.open(filename).resize((width, height))
return ImageTk.PhotoImage(im)
def center_show(self):
ScreenWid, ScreenHei = self.window.maxsize()
CurWid = 500
CurHeight = 400
cen_x = (ScreenWid - CurWid) / 2
cen_y = (ScreenHei - CurHeight) / 2
size_xy = '%dx%d+%d+%d' % (CurWid, CurHeight, cen_x, cen_y)
return size_xy
def createWindow(self):
# command不能加参数,加参数自动执行了!!括号也不行!!代表空值也是参数!!!
# 若想传入参数且不自动执行需要格式为 command = lambda:function(1)
# 链接:
self.window.geometry(self.center_show())
# # 背景图片
canvas_root = tkinter.Canvas(self.window, width=500, height=400)
# im_root = Image.open('technology.jpg').resize((500, 400))
# im = ImageTk.PhotoImage(im_root)
im = self.get_image('city.png', 500, 400)
canvas_root.create_image(250, 200, image=im) # 参数取窗口大小的一半!!!!!!!!!
canvas_root.pack()
# imLabel = Label(self.window, image=img).place(relx=0,rely=0)
Button(self.window, text='学生信息', command=self.stu_info).place(relx=0.05, rely=0.05, relwidth=0.2)
Button(self.window, text='奖惩情况', command=self.stu_reward).place(relx=0.3, rely=0.05, relwidth=0.2)
Button(self.window, text='院系情况', command=self.dept_info).place(relx=0.05, rely=0.15, relwidth=0.2)
Button(self.window, text='课程管理', command=self.course).place(relx=0.3, rely=0.15, relwidth=0.2)
Button(self.window, text='学生选课管理', command=self.course_selection).place(relx=0.05, rely=0.25, relwidth=0.2)
Button(self.window, text='考试管理', command=self.exam).place(relx=0.3, rely=0.25, relwidth=0.2)
Button(self.window, text='补考重修', command=self.exam_makeup).place(relx=0.05, rely=0.35, relwidth=0.2)
# con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
self.window.mainloop() # !!!!!!!!!!!!!!
def stu_info(self): # 学生信息
if not self.handle: # 只有handle为False时(代表无该窗口存在)才能执行建立窗口的语句
self.handle = True
top = Toplevel(self.window)
self.window.withdraw()
# 居中显示
ScreenWid, ScreenHei = top.maxsize()
CurWid = 800
CurHeight = 600
cen_x = (ScreenWid-CurWid)/2
cen_y = (ScreenHei-CurHeight)/2
size_xy = '%dx%d+%d+%d' % (CurWid, CurHeight, cen_x, cen_y)
top.geometry(size_xy)
# **************居中显示语句结束
Label(top, text='学号:').grid(row=0, column=0, pady=5)
Label(top, text='姓名:').grid(row=1, column=0, pady=5)
Label(top, text='性别:').grid(row=2, column=0, pady=5)
Label(top, text='年龄:').grid(row=3, column=0, pady=5)
Label(top, text='单位:').grid(row=4, column=0, pady=5)
Entry(top, textvariable=self.sid).grid(row=0, column=1, pady=5, ipadx=60)
Entry(top, textvariable=self.name).grid(row=1, column=1, pady=5, ipadx=60)
Entry(top, textvariable=self.sex).grid(row=2, column=1, pady=5, ipadx=60)
Entry(top, textvariable=self.age).grid(row=3, column=1, pady=5, ipadx=60)
Entry(top, textvariable=self.dept_name).grid(row=4, column=1, pady=5, ipadx=60)
Button(top, text='显示所有学生信息', command=lambda: self.show_stu_info(tree)).grid(row=0, column=2, padx=200, ipadx=35)
Button(top, text='添加学生信息', command=lambda: self.add_stu_info(tree)).grid(row=1, column=2, padx=200, ipadx=50)
Button(top, text='查询学生信息', command=lambda: self.search_stu_info(tree)).grid(row=2, column=2, padx=200, ipadx=50)
Button(top, text='删除学生信息', command=lambda: self.delete_stu_info(tree)).grid(row=3, column=2, padx=200, ipadx=50)
Button(top, text='修改学生信息', command=lambda: self.modify_stu_info(tree)).grid(row=4, column=2, padx=200, ipadx=50)
# treeview的相关操作参考网站 https://www.jb51.net/article/209215.htm
tree = ttk.Treeview(top, show='headings', column=('sid', 'name', 'sex', 'age', 'dept_name'))
tree.place(rely=0.35, width=CurWid, relheight=0.6)
tree.column('sid', width=150, anchor="center")
tree.column('name', width=200, anchor="center")
tree.column('sex', width=100, anchor="center")
tree.column('age', width=150, anchor="center")
tree.column('dept_name', width=150, anchor="center")
tree.heading('sid', text='学号')
tree.heading('name', text='姓名')
tree.heading('sex', text='性别')
tree.heading('age', text='年龄')
tree.heading('dept_name', text='单位')
# top.geometry('400x500')
top.title("学生信息")
top.protocol("WM_DELETE_WINDOW", lambda: self.quit(top)) # 点击窗口关闭按钮时,自动调用quit函数
def quit(self, master):
self.handle = False
master.destroy()
self.window.deiconify()
# 这下面的语句是为了关闭时清空输入框
self.sid = StringVar() # 学生身份证
self.name = StringVar() # 姓名
self.sex = StringVar() # 性别
self.dept_name = StringVar() # 单位(院系名)
self.age = StringVar() # 年龄
# stu_reward添加
self.type = StringVar()
self.info = StringVar()
# dept_info添加
self.major_name = StringVar()
# course
self.cid = StringVar()
self.course_name = StringVar()
self.teacher = StringVar()
self.time = StringVar()
self.classroom = StringVar()
self.credit = StringVar()
# exam
self.score = StringVar()
# END**************
# 展示所有学生信息
def show_stu_info(self, tree):
if self.user_handle: # 如果是学生则退出
showinfo(title='提示', message='您没有操作权限')
return
x = tree.get_children()
# for item in x:
# print(tree.item(item, "values"))
# print(x)
for item in x:
tree.delete(item)
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
cur.execute("select * from stu_info order by sid")
lst = cur.fetchall()
# treeview的插入方法
for item in lst:
tree.insert("", END, values=item) # END表示插入表格末尾
cur.close()
con.close()
# 关于点击一下标题更换排序方式(升序/降序),可参考博客
# 添加学生信息
def add_stu_info(self, tree):
if self.user_handle: # 如果是学生则退出
showinfo(title='提示', message='您没有操作权限')
return
ans = askyesno(title='提示', message='是否进行当前操作')
if ans is True:
if self.sid.get() == "" or self.name.get() == "" or self.sex.get() == "" or self.age.get() == "" \
or self.dept_name.get() == "":
showerror(title='提示', message='请输入完整信息!')
else:
# x = tree.get_children()
# for item in x:
# tree.delete(item)
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
sid = self.sid.get()
name = self.name.get()
sex = self.sex.get()
age = self.age.get()
dept_name = self.dept_name.get()
# 检验SID是否已经存在
sqlSearch = "select * from stu_info where sid = %s"
result = cur.execute(sqlSearch, sid)
if result > 0:
showerror(title="提示", message="学号已存在!")
else:
sql = "insert into stu_info values(%s,%s,%s,%s,%s)"
try:
cur.execute(sql, (sid, name, sex, age, dept_name))
con.commit()
# showinfo(title="提示", message="添加成功!")
tree.insert("", END, values=(sid, name, sex, age, dept_name))
except:
showerror(title='提示', message='添加失败,请检查是否输入信息过长或者出现格式错误')
# cur.execute("select * from stu_info order by sid")
# lst = cur.fetchall()
cur.close()
con.close()
# 删除学生信息
def delete_stu_info(self, tree):
if self.user_handle: # 如果是学生则退出
showinfo(title='提示', message='您没有操作权限')
return
ans = askyesno(title='提示', message='是否进行当前操作')
if ans is True:
if self.sid.get() == '':
showerror(title='提示', message='请输入学号')
else:
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
line = cur.execute("delete from stu_info where sid = %s", self.sid.get())
if line == 0:
showerror(title="提示", message="删除失败,请检查学号是否输入正确")
else:
showinfo(title="提示", message="删除成功!")
con.commit()
cur.close()
con.close()
self.show_stu_info(tree)
# 查询学生信息
# 如果输入了学号则优先只按照学号查找,若学号一栏为空,则其余栏的内容可以进行混合查找
def search_stu_info(self, tree):
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
sign = 0 # sign=0表示还没有碰到不为空的entry
# 先清除原始数据
x = tree.get_children()
for item in x:
tree.delete(item)
if self.user_handle:
# print(self.user_name)
cur.execute("select * from stu_info where sid = %s", self.user_name)
lst = cur.fetchone()
# print(lst)
tree.insert("", END, values=lst)
cur.close()
con.close()
return
# 这个学号查询不用管,因为肯定至多一个元组,不可能有多个结果
if self.sid.get() != "":
sqlname_1 = "select * from stu_info where sid = %s"
result = cur.execute(sqlname_1, self.sid.get())
if result < 1:
showerror(title='提示', message='未找到相关学生')
else:
lst = cur.fetchall()
for item in lst:
tree.insert("", END, values=item)
cur.close()
con.close()
return # 尝试一下能不能至此直接跳过函数后边的语句 # 可以
if self.name.get()!="":
sqlname_2 = "select * from stu_info where name like '%%%%%s%%%%'"
sqlname_2 = sqlname_2 % (self.name.get())
result = cur.execute(sqlname_2)
lst = cur.fetchall()
if result < 1:
showerror(title='提示', message='未找到相关学生')
else:
for item in lst:
tree.insert("", END, values=item)
if self.sex.get() != "":
temp = tree.get_children() #不知道tree为空的时候返回值是什么,我写if temp is None 也不对
temp_length = 0
# 怎么直接判断temp是否为空啊
for item in temp:
temp_length += 1
if temp_length == 0:
cur.execute("select * from stu_info order by sid")
lst = cur.fetchall()
for item in lst:
tree.insert("", END, values=item)
temp_2 = tree.get_children()
for item in temp_2:
# print((tree.item(item, "values"))[2])
if (tree.item(item, "values"))[2] != self.sex.get():
tree.delete(item)
temp_length -= 1
if temp_length == 0:
# print(tree.get_children())
showerror(title='提示', message='未找到相关学生')
# 年龄查找我决定用一个跟性别查找不太一样的方法,设置一个标志变量sign
if self.age.get() != "":
# 重复的初始化工作******************
temp = tree.get_children()
temp_length = 0
for item in temp:
temp_length += 1
if temp_length == 0:
cur.execute("select * from stu_info order by sid")
lst = cur.fetchall()
for item in lst:
tree.insert("", END, values=item)
# 初始化结束*************************************
sign = False # sign为False代表暂时没找到符合条件的学生
temp_2 = tree.get_children()
for item in temp_2:
if (tree.item(item, "values"))[3] != self.age.get():
tree.delete(item)
else:
sign = True
if sign is False:
showerror(title='提示', message='未找到相关学生')
# 单位查询
if self.dept_name.get() != "":
# 重复的初始化工作******************
temp = tree.get_children()
temp_length = 0
for item in temp:
temp_length += 1
if temp_length == 0:
cur.execute("select * from stu_info order by sid")
lst = cur.fetchall()
for item in lst:
tree.insert("", END, values=item)
# 初始化结束*************************************
sign = False # sign为False代表暂时没找到符合条件的学生
temp_2 = tree.get_children()
for item in temp_2:
if (tree.item(item, "values"))[4] != self.dept_name.get():
tree.delete(item)
else:
sign = True
if sign is False:
showerror(title='提示', message='未找到相关学生')
if self.sid.get() == "" and self.name.get() == "" and self.sex.get() == "" and self.age.get() == "" \
and self.dept_name.get() == "":
showerror(title='提示', message='请至少输入一条查询信息')
con.close()
cur.close()
def modify_stu_info(self, tree):
if self.user_handle: # 如果是学生则退出
showinfo(title='提示', message='您没有操作权限')
return
ans = askyesno(title='提示', message='是否进行当前操作')
if ans is True:
if self.sid.get() == "" and self.name.get() == "" and self.sex.get() == "" and self.age.get() == "" \
and self.dept_name.get() == "":
showerror(title='提示', message='请输入完整信息!')
else:
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
sql = 'update stu_info set name=%s, sex=%s, age=%s, dept_name=%s where sid=%s'
try:
cur.execute(sql,(self.name.get(), self.sex.get(), self.age.get(), self.dept_name.get(), self.sid.get()))
# showinfo(title='提示', message='修改成功!')
con.commit()
self.show_stu_info(tree)
except:
con.rollback()
showerror(title="提示", message="修改失败!请检查信息格式!")
con.close()
cur.close()
def stu_reward(self): # 奖惩情况 reward or punish
# 主码为sid 并且有name列,另有type列以及info列 分别代表奖励或者惩罚(type)、具体简洁信息(info)
if not self.handle: # 只有handle为False时(代表无该窗口存在)才能执行建立窗口的语句
self.handle = True
top = Toplevel(self.window)
self.window.withdraw()
# 居中显示
ScreenWid, ScreenHei = top.maxsize()
CurWid = 800
CurHeight = 600
cen_x = (ScreenWid - CurWid) / 2
cen_y = (ScreenHei - CurHeight) / 2
size_xy = '%dx%d+%d+%d' % (CurWid, CurHeight, cen_x, cen_y)
top.geometry(size_xy)
# ****************
Label(top, text='学号:').grid(row=0, column=0, pady=5)
Label(top, text='姓名:').grid(row=1, column=0, pady=5)
Label(top, text='类型:').grid(row=2, column=0, pady=5)
Label(top, text='备注信息:').grid(row=3, column=0, pady=5)
Entry(top, textvariable=self.sid).grid(row=0, column=1, pady=5, ipadx=60)
Entry(top, textvariable=self.name).grid(row=1, column=1, pady=5, ipadx=60)
Entry(top, textvariable=self.type).grid(row=2, column=1, pady=5, ipadx=60)
Entry(top, textvariable=self.info).grid(row=3, column=1, pady=5, ipadx=60)
tree = ttk.Treeview(top, show='headings', column=('sid', 'name', 'type', 'info'))
Button(top, text='显示所有奖惩信息', command=lambda: self.show_stu_reward(tree)).grid(row=0, column=2, padx=200, ipadx=35)
Button(top, text='添加奖惩信息', command=lambda: self.add_stu_reward(tree)).grid(row=1, column=2, padx=200, ipadx=50)
Button(top, text='查询奖惩信息', command=lambda: self.search_stu_reward(tree)).grid(row=2, column=2, padx=200, ipadx=50)
Button(top, text='删除奖惩信息', command=lambda: self.delete_stu_reward(tree)).grid(row=3, column=2, padx=200, ipadx=50)
Button(top, text='修改奖惩信息', command=lambda: self.modify_stu_reward(tree)).grid(row=4, column=2, padx=200, ipadx=50)
tree.place(rely=0.35, width=CurWid, relheight=0.6)
tree.column('sid', width=100, anchor="center")
tree.column('name', width=100, anchor="center")
tree.column('type', width=100, anchor="center")
tree.column('info', width=350, anchor="center")
tree.heading('sid', text='学号')
tree.heading('name', text='姓名')
tree.heading('type', text='类型')
tree.heading('info', text='备注信息')
top.title('奖惩情况')
top.protocol("WM_DELETE_WINDOW", lambda: self.quit(top))
def show_stu_reward(self, tree):
x = tree.get_children()
for item in x:
tree.delete(item)
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
if self.user_handle: # 如果是学生
cur.execute("select * from stu_reward where sid = %s", self.user_name)
lst = cur.fetchall()
for item in lst:
tree.insert("", END, values=item) # END表示插入表格末尾
cur.close()
con.close()
return
cur.execute("select * from stu_reward order by sid")
lst = cur.fetchall()
for item in lst:
tree.insert("", END, values=item) # END表示插入表格末尾
cur.close()
con.close()
def add_stu_reward(self, tree):
if self.user_handle: # 如果是学生则退出
showinfo(title='提示', message='您没有操作权限')
return
ans = askyesno(title='提示', message='是否进行当前操作')
if ans is True:
if self.sid.get() == "" or self.name.get() == "" or self.type.get() == "" or self.info.get() == "" :
showerror(title='提示', message='请输入完整信息!')
else:
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
sid = self.sid.get()
name = self.name.get()
type = self.type.get()
info = self.info.get()
# 检验SID是否已经存在
sqlSearch = "select * from stu_info where sid = %s and name=%s"
result = cur.execute(sqlSearch, (sid, name))
if result == 0:
showerror(title="提示", message="对应学生不存在!请检索学生信息表!")
else:
sql = "insert into stu_reward values(%s,%s,%s,%s)"
try:
cur.execute(sql, (sid, name, type, info, ))
con.commit()
tree.insert("", END, values=(sid, name, type, info))
except:
showerror(title='提示', message='添加失败,请检查是否输入信息过长或者出现格式错误')
cur.close()
con.close()
def delete_stu_reward(self, tree):
if self.user_handle: # 如果是学生则退出
showinfo(title='提示', message='您没有操作权限')
return
ans = askyesno(title='提示', message='是否进行当前操作')
if ans is True:
if self.sid.get() == '':
showerror(title='提示', message='请输入学号')
else:
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
# 这里不加换行符行吗?***************
line = cur.execute("delete from stu_reward where sid = %s and type = %s and info = %s",
(self.sid.get(), self.type.get(), self.info.get()))
if line == 0:
showerror(title="提示", message="删除失败,请检查是否输入正确(学号,类型,备注信息)")
else:
showinfo(title="提示", message="删除成功!")
con.commit()
cur.close()
con.close()
self.show_stu_reward(tree)
# 查询奖惩信息
# 还是一样的,当有学号时直接结束函数,返回学号等于当前值的全部数据 当然可以再优化一下,但我现在不想写了T_T
def search_stu_reward(self, tree):
if self.user_handle: # 如果是学生则退出
showinfo(title='提示', message='您没有操作权限')
return
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
sign = 0 # sign=0表示还没有碰到不为空的entry
# 先清除原始数据
x = tree.get_children()
for item in x:
tree.delete(item)
if self.sid.get()!="":
sqlname_1 = "select * from stu_reward where sid = %s"
result = cur.execute(sqlname_1, self.sid.get())
if result < 1:
showerror(title='提示', message='未找到相关信息')
else:
lst = cur.fetchall()
for item in lst:
tree.insert("", END, values=item)
cur.close()
con.close()
return
# name查找
if self.name.get()!="":
sqlname_2 = "select * from stu_reward where name like '%%%%%s%%%%'"
sqlname_2 = sqlname_2 % (self.name.get())
result = cur.execute(sqlname_2)
lst = cur.fetchall()
if result < 1:
showerror(title='提示', message='未找到相关学生')
else:
for item in lst:
tree.insert("", END, values=item)
# type查找
if self.type.get() != "":
temp = tree.get_children() #不知道tree为空的时候返回值是什么,我写if temp is None 也不对
temp_length = 0
# 怎么直接判断temp是否为空啊
for item in temp:
temp_length += 1
# 如果type查询之前得到的tree为空,则利用当前type值对table进行搜索,得到所有的type等于当前值的元组
if temp_length == 0:
sql = "select * from stu_reward where type = %s order by sid"
cur.execute(sql, self.type.get())
lst = cur.fetchall()
for item in lst:
tree.insert("", END, values=item)
temp_length += 1
# 不管上面的if语句有没有执行,程序运行到此tree中一定已经有了部分数据(当然也有可能还是空的)
# 还要执行for循环的意义在于:有可能上述if语句没有执行,那么tree中得到的数据并不一定都是满足type等于当前值的
# 所以需要进行一次for循环将tree中type值不符合条件的数据删掉
temp_2 = tree.get_children()
for item in temp_2:
# print((tree.item(item, "values"))[2])
if (tree.item(item, "values"))[2] != self.type.get():
tree.delete(item)
temp_length -= 1
if temp_length == 0:
# print(tree.get_children())
showerror(title='提示', message='未找到相关学生')
# info查找
if self.info.get() != "":
# 重复的初始化工作******************
temp = tree.get_children()
temp_length = 0
for item in temp:
temp_length += 1
if temp_length == 0:
sql = "select * from stu_reward where info = %s order by sid"
cur.execute(sql, self.info.get())
lst = cur.fetchall()
for item in lst:
tree.insert("", END, values=item)
temp_length += 1
# 初始化结束*************************************
temp_2 = tree.get_children()
for item in temp_2:
if (tree.item(item, "values"))[3] != self.info.get():
tree.delete(item)
temp_length -= 1
if temp_length == 0:
showerror(title='提示', message='未找到相关学生')
if self.sid.get() == "" and self.name.get() == "" and self.type.get() == "" and self.info.get() == "":
showerror(title='提示', message='请至少输入一条查询信息')
con.close()
cur.close()
# 有一个比较严重的问题,姓名如果改了那么另一个表里学号对应的姓名也需要改,否则会有冲突,要处理好两个表共同拥有的属性
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
def modify_stu_reward(self, tree):
if self.user_handle: # 如果是学生则退出
showinfo(title='提示', message='您没有操作权限')
return
ans = askyesno(title='提示', message='是否进行当前操作')
if ans is True:
if self.sid.get() == "" and self.name.get() == "" and self.type.get() == "" and self.info.get() == "":
showerror(title='提示', message='请输入完整信息!')
else:
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
sql = 'update stu_reward set name=%s, type=%s, info=%s where sid=%s'
try:
cur.execute(sql,
(self.name.get(), self.type.get(), self.info.get(), self.sid.get()))
# showinfo(title='提示', message='修改成功!')
sql = 'update stu_info set name = %s where sid = %s'
cur.execute(sql, (self.name.get(), self.sid.get()))
self.show_stu_reward(tree)
con.commit()
except:
con.rollback()
showerror(title="提示", message="修改失败!请检查信息格式!或检查学生信息中有无此人!")
self.show_stu_reward(tree)
con.close()
cur.close()
def dept_info(self): # 院系情况
if self.user_handle: # 如果是学生则退出
showinfo(title='提示', message='您没有操作权限')
return
if not self.handle: # 只有handle为False时(代表无该窗口存在)才能执行建立窗口的语句
self.handle = True
top = Toplevel(self.window)
self.window.withdraw()
handle_dept = False # False代表没有开窗口
# 居中显示
ScreenWid, ScreenHei = top.maxsize()
CurWid = 800
CurHeight = 600
cen_x = (ScreenWid - CurWid) / 2
cen_y = (ScreenHei - CurHeight) / 2
size_xy = '%dx%d+%d+%d' % (CurWid, CurHeight, cen_x, cen_y)
top.geometry(size_xy)
# ****************
Label(top, text='学院名称:').grid(row=0, column=0, pady=5)
Label(top, text='专业名称:').grid(row=1, column=0, pady=5)
Entry(top, textvariable=self.dept_name).grid(row=0, column=1, pady=5, ipadx=60)
Entry(top, textvariable=self.major_name).grid(row=1, column=1, pady=5, ipadx=60)
tree = ttk.Treeview(top, show='headings', column=('dept_name', 'major_name'))
Button(top, text='显示所有院系信息', command=lambda: self.show_dept_info(tree)).grid(row=0, column=2, padx=200, ipadx=35)
Button(top, text='查询院系信息', command=lambda: self.search_dept_info(tree)).grid(row=1, column=2, padx=200, ipadx=50)
Button(top, text='修改院系信息', command=lambda: self.modify_dept_info(tree, top)).grid(row=2, column=2, padx=200, ipadx=50)
tree.place(rely=0.25, width=CurWid, relheight=0.6)
tree.column('dept_name', width=300, anchor="center")
tree.column('major_name', width=300, anchor="center")
tree.heading('dept_name', text='学院名称')
tree.heading('major_name', text='专业名称')
top.title('院系情况')
top.protocol("WM_DELETE_WINDOW", lambda: self.quit(top))
# 退出修改院系信息
def quit_2(self, master):
master.destroy()
self.handle_2 = False
def show_dept_info(self, tree):
x = tree.get_children()
for item in x:
tree.delete(item)
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
cur.execute("select * from dept_info order by dept_name")
lst = cur.fetchall()
for item in lst:
tree.insert("", END, values=item) # END表示插入表格末尾
cur.close()
con.close()
# 不能增加信息,只能设置或修改信息
def search_dept_info(self, tree):
# 先清除原始数据
x = tree.get_children()
for item in x:
tree.delete(item)
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
# dept_name查找
if self.dept_name.get() != "":
sqlname_2 = "select * from dept_info where dept_name like '%%%%%s%%%%'"
sqlname_2 = sqlname_2 % (self.dept_name.get())
result = cur.execute(sqlname_2)
lst = cur.fetchall()
if result < 1:
showerror(title='提示', message='未找到相关学院')
else:
for item in lst:
tree.insert("", END, values=item)
# major_name查找
if self.major_name.get() != "":
temp = tree.get_children() # 不知道tree为空的时候返回值是什么,我写if temp is None 也不对
temp_length = 0
# 怎么直接判断temp是否为空啊
for item in temp:
temp_length += 1
# 如果major_name查询之前得到的tree为空,则利用当前major_name值对table进行搜索,得到所有的major_name等于当前值的元组
if temp_length == 0:
sql = "select * from dept_info where major_name like '%%%%%s%%%%' order by dept_name"
cur.execute(sql, self.major_name.get())
lst = cur.fetchall()
for item in lst:
tree.insert("", END, values=item)
temp_length += 1
# 不管上面的if语句有没有执行,程序运行到此tree中一定已经有了部分数据(当然也有可能还是空的)
# 还要执行for循环的意义在于:有可能上述if语句没有执行,那么tree中得到的数据并不一定都是满足major_name等于当前值的
# 所以需要进行一次for循环将tree中major_name值不符合条件的数据删掉
temp_2 = tree.get_children()
for item in temp_2:
# print((tree.item(item, "values"))[2])
if self.major_name.get() not in (tree.item(item, "values"))[1]:
tree.delete(item)
temp_length -= 1
if temp_length == 0:
# print(tree.get_children())
showerror(title='提示', message='未找到相关信息')
def modify_dept_info(self, tree, master):
if not self.handle_2:
self.handle_2 = True
top = Toplevel(master)
top.resizable(False, False)
# 居中显示
ScreenWid, ScreenHei = top.maxsize()
CurWid = 400
CurHeight = 300
cen_x = (ScreenWid - CurWid) / 2
cen_y = (ScreenHei - CurHeight) / 2
size_xy = '%dx%d+%d+%d' % (CurWid, CurHeight, cen_x, cen_y)
top.geometry(size_xy)
# ****************
Label(top, text='原学院名称:').place(relx=0.1, rely=0.2)
pre_name=Entry(top)
pre_name.place(relx=0.32, rely=0.2)
Label(top, text='更改后学院名称:').place(relx=0.04, rely=0.3)
new_name=Entry(top)
new_name.place(relx=0.32,rely=0.3)
butt_1=Button(top,text='修改学院名称',command=lambda:self.modify_dept_name(pre_name.get(), new_name.get()))
butt_1.place(relx=0.05,rely=0.8)
Label(top, text='原专业名称:').place(relx=0.1, rely=0.45)
pre_name_2 = Entry(top)
pre_name_2.place(relx=0.32, rely=0.45)
Label(top, text='更改后专业名称:').place(relx=0.04, rely=0.55)
new_name_2 = Entry(top)
new_name_2.place(relx=0.32, rely=0.55)
butt_2 = Button(top, text='修改专业名称', command=lambda: self.modify_major_name(pre_name_2.get(), new_name_2.get()))
butt_2.place(relx=0.7, rely=0.8)
top.protocol("WM_DELETE_WINDOW",lambda:self.quit_2(top))
def modify_dept_name(self, pre_name, new_name):
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
sign = 0
sql = 'update dept_info set dept_name = %s where dept_name = %s'
sql_2 = 'update stu_info set dept_name = %s where dept_name = %s'
try:
cur.execute(sql, (new_name, pre_name))
cur.execute(sql_2, (new_name, pre_name))
con.commit()
except:
con.rollback()
showerror(title='提示', message='修改失败!')
sign = 1
if sign == 0:
showinfo(title='提示', message='修改成功!')
con.close()
cur.close()
def modify_major_name(self, pre_name, new_name):
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
sql = 'update dept_info set major_name = %s where major_name = %s'
result = cur.execute(sql, (new_name, pre_name))
if result < 1:
showerror(title='提示', message='修改失败!')
else:
showinfo(title='提示', message='修改成功!')
con.commit()
con.close()
cur.close()
def course(self): # 课程管理
if not self.handle: # 只有handle为False时(代表无该窗口存在)才能执行建立窗口的语句
self.handle = True
top = Toplevel(self.window)
self.window.withdraw()
# 居中显示
ScreenWid, ScreenHei = top.maxsize()
CurWid = 800
CurHeight = 600
cen_x = (ScreenWid - CurWid) / 2
cen_y = (ScreenHei - CurHeight) / 2
size_xy = '%dx%d+%d+%d' % (CurWid, CurHeight, cen_x, cen_y)
top.geometry(size_xy)
# ****************
top.title('课程管理')
top.protocol("WM_DELETE_WINDOW", lambda: self.quit(top)) # 点击关闭按钮时跳入quit函数
tree = ttk.Treeview(top, show='headings', column=('cid', 'name', 'teacher', 'time', 'classroom', 'credit'))
tree.place(rely=0.37, width=CurWid, relheight=0.6)
tree.column('cid', width=100, anchor="center")
tree.column('name', width=200, anchor="center")
tree.column('teacher', width=100, anchor="center")
tree.column('time', width=150, anchor="center")
tree.column('classroom', width=150, anchor="center")
tree.column('credit', width=50, anchor='center')
tree.heading('cid', text='课程号')
tree.heading('name', text='课程名')
tree.heading('teacher', text='老师')
tree.heading('time', text='时间')
tree.heading('classroom', text='教室')
tree.heading('credit', text='学分')
Label(top, text='课程号:').grid(row=0, column=0, pady=5)
Label(top, text='课程名:').grid(row=1, column=0, pady=5)
Label(top, text='老师:').grid(row=2, column=0, pady=5)
Label(top, text='时间:').grid(row=3, column=0, pady=5)
Label(top, text='教室:').grid(row=4, column=0, pady=5)
Label(top, text='学分:').grid(row=5, column=0, pady=5)
Entry(top, textvariable=self.cid).grid(row=0, column=1, pady=5, ipadx=60)
Entry(top, textvariable=self.course_name).grid(row=1, column=1, pady=5, ipadx=60)
Entry(top, textvariable=self.teacher).grid(row=2, column=1, pady=5, ipadx=60)
Entry(top, textvariable=self.time).grid(row=3, column=1, pady=5, ipadx=60)
Entry(top, textvariable=self.classroom).grid(row=4, column=1, pady=5, ipadx=60)
Entry(top, textvariable=self.credit).grid(row=5, column=1, pady=5, ipadx=60)
Button(top, text='显示所有课程信息', command=lambda: self.show_course_info(tree)).grid(row=0, column=2, padx=200, ipadx=35)
Button(top, text='查询课程信息', command=lambda: self.search_course_info(tree)).grid(row=1, column=2, padx=200, ipadx=50)
def show_course_info(self, tree):
x = tree.get_children()
for item in x:
tree.delete(item)
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
cur.execute("select * from course order by cid")
lst = cur.fetchall()
for item in lst:
tree.insert("", END, values=item) # END表示插入表格末尾
cur.close()
con.close()
def search_course_info(self, tree):
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
sign = 0 # sign=0表示还没有碰到不为空的entry
# 先清除原始数据
x = tree.get_children()
for item in x:
tree.delete(item)
if self.cid.get() != "":
sqlname_1 = "select * from course where cid = %s"
result = cur.execute(sqlname_1, self.cid.get())
if result < 1:
showerror(title='提示', message='未找到相关课程')
else:
lst = cur.fetchall()
for item in lst:
tree.insert("", END, values=item)
cur.close()
con.close()
return # 函数结束直接跳出
if self.course_name.get() != "":
sqlname_2 = "select * from course where course_name like '%%%%%s%%%%'"
sqlname_2 = sqlname_2 % (self.course_name.get())
result = cur.execute(sqlname_2)
lst = cur.fetchall()
if result < 1:
showerror(title='提示', message='未找到相关课程')
else:
for item in lst:
tree.insert("", END, values=item)
if self.teacher.get() != "":
temp = tree.get_children()
temp_length = 0
for item in temp:
temp_length += 1
if temp_length == 0:
cur.execute("select * from course order by cid")
lst = cur.fetchall()
for item in lst:
tree.insert("", END, values=item)
temp_2 = tree.get_children()
for item in temp_2:
# print((tree.item(item, "values"))[2])
if (tree.item(item, "values"))[2] != self.teacher.get():
tree.delete(item)
temp_length -= 1
if temp_length == 0:
showerror(title='提示', message='未找到相关课程')
if self.time.get() != "":
temp = tree.get_children()
temp_length = 0
for item in temp:
temp_length += 1
if temp_length == 0:
cur.execute("select * from course order by cid")
lst = cur.fetchall()
for item in lst:
tree.insert("", END, values=item)
temp_2 = tree.get_children()
for item in temp_2:
if (tree.item(item, "values"))[3] != self.time.get():
tree.delete(item)
temp_length -= 1
if temp_length == 0:
showerror(title='提示', message='未找到相关课程')
if self.classroom.get() != "":
temp = tree.get_children()
temp_length = 0
for item in temp:
temp_length += 1
if temp_length == 0:
cur.execute("select * from course order by cid")
lst = cur.fetchall()
for item in lst:
tree.insert("", END, values=item)
temp_2 = tree.get_children()
for item in temp_2:
if (tree.item(item, "values"))[4] != self.classroom.get():
tree.delete(item)
temp_length -= 1
if temp_length == 0:
showerror(title='提示', message='未找到相关课程')
if self.credit.get() != "":
temp = tree.get_children()
temp_length = 0
for item in temp:
temp_length += 1
if temp_length == 0:
cur.execute("select * from course order by cid")
lst = cur.fetchall()
for item in lst:
tree.insert("", END, values=item)
temp_2 = tree.get_children()
for item in temp_2:
if (tree.item(item, "values"))[5] != self.credit.get():
tree.delete(item)
temp_length -= 1
if temp_length == 0:
showerror(title='提示', message='未找到相关课程')
if self.cid.get() == "" and self.course_name.get() == "" and self.teacher.get() == "" and self.time.get() == "" \
and self.classroom.get() == "" and self.credit.get() == "":
showerror(title='提示', message='请至少输入一条查询信息')
con.close()
cur.close()
def course_selection(self): # 学生选课管理
if not self.handle: # 只有handle为False时(代表无该窗口存在)才能执行建立窗口的语句
self.handle = True
top = Toplevel(self.window)
self.window.withdraw()
# 居中显示
ScreenWid, ScreenHei = top.maxsize()
CurWid = 800
CurHeight = 600
cen_x = (ScreenWid - CurWid) / 2
cen_y = (ScreenHei - CurHeight) / 2
size_xy = '%dx%d+%d+%d' % (CurWid, CurHeight, cen_x, cen_y)
top.geometry(size_xy)
# ****************
top.title('学生选课管理')
top.protocol("WM_DELETE_WINDOW", lambda: self.quit(top))
tree = ttk.Treeview(top, show='headings', column=('sid', 'stu_name', 'cid', 'course_name'))
tree.place(rely=0.37, width=CurWid, relheight=0.6)
tree.column('sid', width=175, anchor="center")
tree.column('stu_name', width=200, anchor="center")
tree.column('cid', width=175, anchor="center")
tree.column('course_name', width=200, anchor="center")
tree.heading('sid', text='学号')
tree.heading('stu_name', text='姓名')
tree.heading('cid', text='课程号')
tree.heading('course_name', text='课程名')
Label(top, text='学号:').grid(row=0, column=0, pady=5)
Label(top, text='姓名:').grid(row=1, column=0, pady=5)
Label(top, text='课程号:').grid(row=2, column=0, pady=5)
Label(top, text='课程名:').grid(row=3, column=0, pady=5)
Entry(top, textvariable=self.sid).grid(row=0, column=1, pady=5, ipadx=60)
Entry(top, textvariable=self.name).grid(row=1, column=1, pady=5, ipadx=60)
Entry(top, textvariable=self.cid).grid(row=2, column=1, pady=5, ipadx=60)
Entry(top, textvariable=self.course_name).grid(row=3, column=1, pady=5, ipadx=60)
Button(top, text='显示所有选课信息', command=lambda: self.show_selection(tree)).grid(row=0, column=2, padx=200, ipadx=35)
Button(top, text='添加选课信息', command=lambda: self.add_selection(tree)).grid(row=1, column=2, padx=200, ipadx=50)
Button(top, text='查询选课信息', command=lambda: self.search_selection(tree)).grid(row=2, column=2, padx=200, ipadx=50)
Button(top, text='删除选课信息', command=lambda: self.delete_selection(tree)).grid(row=3, column=2, padx=200, ipadx=50)
def show_selection(self, tree):
x = tree.get_children()
for item in x:
tree.delete(item)
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
if self.user_handle: # 如果是学生
cur.execute("select sid,stu_name,cid,course_name from stu_course where sid = %s", self.user_name)
lst = cur.fetchall()
else:
cur.execute("select sid,stu_name,cid,course_name from stu_course order by sid")
lst = cur.fetchall()
for item in lst:
tree.insert("", END, values=item) # END表示插入表格末尾
cur.close()
con.close()
def add_selection(self, tree):
ans = askyesno(title='提示', message='是否进行当前操作')
if ans is True:
if self.sid.get() == "" or self.cid.get() == "":
showerror(title='提示', message='请输入学号与课程号!')
else:
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
if self.user_handle: # 如果是学生用户
sid = self.user_name
else:
sid = self.sid.get()
name = self.name.get()
cid = self.cid.get()
# 检验(SID,CID)是否已经存在
sqlSearch = "select * from stu_course where sid = %s and cid = %s"
result = cur.execute(sqlSearch, (sid, cid))
if result > 0:
showerror(title="提示", message="该选课已存在!")
else: # 此处还要加一个防止时间冲突的语句
cur.execute("select time from course where cid = %s", self.cid.get())
temp_time = cur.fetchone()
temp_result = cur.execute("select time,course_name from stu_course natural join course where"
" sid = %s and time = %s", (self.sid.get(), temp_time))
if temp_result > 0:
lst = cur.fetchone()
showerror(title='提示', message="选课时间与%s冲突" % lst[1])
return
# cur.execute("select ")
cur.execute("select sid,name from stu_info where sid = %s", (self.sid.get()))
temp_stu = cur.fetchone()
cur.execute("select cid,course_name from course where cid = %s", (self.cid.get()))
temp_course = cur.fetchone()
# print(temp_stu[0], temp_stu[1], temp_course[0], temp_course[1])
sql_2 = "insert into stu_course values(%s,%s,%s,%s,NULL)"
result = cur.execute(sql_2, (temp_stu[0], temp_stu[1], temp_course[0], temp_course[1]))
if result > 0:
con.commit()
showinfo(title="提示", message="添加成功!")
tree.insert("", END, values=(temp_stu[0], temp_stu[1], temp_course[0], temp_course[1]))
else:
showerror(title='提示', message='添加失败!')
cur.close()
con.close()
def search_selection(self, tree):
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
# 先清除原始数据
x = tree.get_children()
for item in x:
tree.delete(item)
if self.user_handle:
if self.cid.get() != "":
sql = "select sid,stu_name,cid,course_name from stu_course where sid = %s and cid = %s"
result = cur.execute(sql, (self.user_name, self.cid.get()))
if result == 0:
showerror(title='提示', message='未找到相关选课信息!')
else:
lst = cur.fetchall()
for item in lst:
tree.insert("", END, values=item)
return
sign = False # false代表表格中还没有信息
if self.sid.get() == "" and self.cid.get() == "":
showerror(title='提示', message='请输入完整信息!')
if self.sid.get() != "":
sql = "select sid,stu_name,cid,course_name from stu_course where sid = %s order by cid"
result = cur.execute(sql, self.sid.get())
if result == 0:
showerror(title='提示', message='未找到相关选课信息!')
return
else:
lst = cur.fetchall()
for item in lst:
tree.insert("", END, values=item)
sign = True
if self.cid.get() != "":
if not sign:
sql = "select sid,stu_name,cid,course_name from stu_course where cid = %s order by sid"
result = cur.execute(sql, self.cid.get())
if result == 0:
showerror(title='提示', message='未找到相关选课信息!')
# return
else:
lst = cur.fetchall()
for item in lst:
tree.insert("", END, values=item)
else:
x = tree.get_children()
for item in x:
if (tree.item(item, "values"))[2] != self.cid.get():
tree.delete(item)
con.close()
cur.close()
def delete_selection(self, tree):
ans = askyesno(title='提示', message='是否进行当前操作')
if ans is True:
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
if self.sid.get() == "" or self.cid.get() == "":
showerror(title='提示', message='请输入完整信息!')
else:
result = cur.execute("delete from stu_course where sid = %s and cid = %s", (self.sid.get(), self.cid.get()))
if result == 0:
showerror(title='提示', message='删除失败!')
else:
x = tree.get_children()
for item in x:
if (tree.item(item, "values"))[0] == self.sid.get() \
and (tree.item(item, "values"))[2] == self.cid.get():
tree.delete(item)
con.commit()
con.close()
cur.close()
def exam(self): # 考试管理(登记分数)
if not self.handle: # 只有handle为False时(代表无该窗口存在)才能执行建立窗口的语句
self.handle = True
top = Toplevel(self.window)
self.window.withdraw()
# 居中显示
ScreenWid, ScreenHei = top.maxsize()
CurWid = 800
CurHeight = 600
cen_x = (ScreenWid - CurWid) / 2
cen_y = (ScreenHei - CurHeight) / 2
size_xy = '%dx%d+%d+%d' % (CurWid, CurHeight, cen_x, cen_y)
top.geometry(size_xy)
# ****************
top.title('考试管理')
top.protocol("WM_DELETE_WINDOW", lambda: self.quit(top))
tree = ttk.Treeview(top, show='headings', column=('sid', 'stu_name', 'cid', 'course_name', 'score'))
tree.place(rely=0.37, width=CurWid, relheight=0.6)
tree.column('sid', width=150, anchor="center")
tree.column('stu_name', width=200, anchor="center")
tree.column('cid', width=150, anchor="center")
tree.column('course_name', width=200, anchor="center")
tree.column('score', width=50, anchor="center")
tree.heading('sid', text='学号')
tree.heading('stu_name', text='姓名')
tree.heading('cid', text='课程号')
tree.heading('course_name', text='课程名')
tree.heading('score', text='成绩')
Label(top, text='学号:').grid(row=0, column=0, pady=5)
Label(top, text='姓名:').grid(row=1, column=0, pady=5)
Label(top, text='课程号:').grid(row=2, column=0, pady=5)
Label(top, text='课程名:').grid(row=3, column=0, pady=5)
Label(top, text='成绩:').grid(row=4, column=0, pady=5)
Entry(top, textvariable=self.sid).grid(row=0, column=1, pady=5, ipadx=60)
Entry(top, textvariable=self.name).grid(row=1, column=1, pady=5, ipadx=60)
Entry(top, textvariable=self.cid).grid(row=2, column=1, pady=5, ipadx=60)
Entry(top, textvariable=self.course_name).grid(row=3, column=1, pady=5, ipadx=60)
Entry(top, textvariable=self.score).grid(row=4, column=1, pady=5, ipadx=60)
Button(top, text='显示所有成绩信息', command=lambda: self.show_exam(tree)).grid(row=0, column=2, padx=200,
ipadx=35)
Button(top, text='更新学生成绩', command=lambda: self.update_score(tree)).grid(row=1, column=2, padx=200,
ipadx=50)
Button(top, text='查询成绩信息', command=lambda: self.search_exam(tree)).grid(row=2, column=2, padx=200,
ipadx=50)
Button(top, text='查看表中及格信息', command=lambda: self.pass_score(tree)).grid(row=3, column=2, padx=200,
ipadx=35)
Button(top, text='查看表中挂科信息', command=lambda: self.fail_score(tree)).grid(row=4, column=2, padx=200,
ipadx=35)
def show_exam(self, tree):
x = tree.get_children()
for item in x:
tree.delete(item)
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
if self.user_handle: # 如果是学生则退出
cur.execute("select * from stu_course where sid = %s",self.user_name)
else:
cur.execute("select * from stu_course order by sid")
lst = cur.fetchall()
for item in lst:
tree.insert("", END, values=item) # END表示插入表格末尾
cur.close()
con.close()
def update_score(self, tree):
if self.user_handle: # 如果是学生则退出
showinfo(title='提示', message='您没有操作权限')
return
ans = askyesno(title='提示', message='是否进行当前操作\n(注意:只有成绩为空或有误时才可更新)')
if ans is True:
if self.sid.get() == "" or self.cid.get() == "" or self.score.get() == "":
showerror(title='提示', message='请输入完整信息')
return
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
sql = "update stu_course set score = %s where sid = %s and cid = %s"
result = cur.execute(sql, (self.score.get(), self.sid.get(), self.cid.get()))
if result == 0:
showerror(title='提示', message='更新失败!')
else:
if float(self.score.get()) >= 60:
cur.execute("delete from exam_makeup where sid = %s and cid = %s", (self.sid.get(), self.cid.get()))
con.commit()
showinfo(title='提示', message='更新成功!')
self.show_exam(tree)
cur.close()
con.close()
def search_exam(self, tree):
if self.user_handle: # 如果是学生则退出
showinfo(title='提示', message='您没有操作权限')
return
x = tree.get_children()
for item in x:
tree.delete(item)
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
if self.cid.get() != "" and self.sid.get() != "":
sql = "select * from stu_course where sid = %s and cid = %s"
result = cur.execute(sql, (self.sid.get(), self.cid.get()))
if result == 0:
showerror(title='提示', message='未找到相关信息')
else:
lst = cur.fetchone()
tree.insert("", END, value=lst)
else:
if self.sid.get() != "":
result = cur.execute("select * from stu_course where sid = %s", self.sid.get())
if result > 0:
lst = cur.fetchall()
for item in lst:
tree.insert("", END, value=item)
else:
showerror(title='提示', message='未找到相关信息')
if self.name.get() != "":
temp = 0
x = tree.get_children()
for item in x:
temp += 1
if temp == 0: # 代表当前表格中没有数据
result = cur.execute("select * from stu_course where stu_name like '%%%%%s%%%%'" % (self.name.get()))
if result > 0:
lst = cur.fetchall()
for item in lst:
tree.insert("", END, value=item)
else:
showerror(title='提示', message='未找到相关信息')
else:
for item in x:
if self.name.get() not in (tree.item(item, "values"))[1]:
tree.delete(item)
# print("deleting......")
if self.cid.get() != "":
temp = 0
x = tree.get_children()
for item in x:
temp += 1
if temp == 0: # 代表当前表格中没有数据
result = cur.execute("select * from stu_course where cid = %s", self.cid.get())
if result > 0:
lst = cur.fetchall()
for item in lst:
tree.insert("", END, value=item)
else:
showerror(title='提示', message='未找到相关信息')
else:
for item in x:
if self.cid.get() != (tree.item(item, "values"))[2]:
tree.delete(item)
if self.course_name.get() != "":
temp = 0
x = tree.get_children()
for item in x:
temp += 1
if temp == 0: # 代表当前表格中没有数据
result = cur.execute(
"select * from stu_course where course_name like '%%%%%s%%%%'" % (self.course_name.get()))
if result > 0:
lst = cur.fetchall()
for item in lst:
tree.insert("", END, value=item)
else:
showerror(title='提示', message='未找到相关信息')
else:
for item in x:
if self.course_name.get() not in (tree.item(item, "values"))[3]:
tree.delete(item)
if self.score.get() != "":
temp = 0
x = tree.get_children()
for item in x:
temp += 1
if temp == 0: # 代表当前表格中没有数据
# print(float(self.score.get()))
result = cur.execute("select * from stu_course where score = %s", self.score.get())
if result > 0:
lst = cur.fetchall()
for item in lst:
tree.insert("", END, value=item)
else:
showerror(title='提示', message='未找到相关信息')
else:
for item in x:
if (tree.item(item, "values"))[4] == "None":
tree.delete(item)
else:
if float(self.score.get()) != float((tree.item(item, "values"))[4]):
tree.delete(item)
con.close()
cur.close()
# 只留下表格中不及格的信息
def fail_score(self, tree):
x = tree.get_children()
for item in x:
if(tree.item(item, "values"))[4] == "None":
tree.delete(item)
else:
if float((tree.item(item, "values"))[4]) >= 60:
tree.delete(item)
def pass_score(self, tree):
x = tree.get_children()
for item in x:
if (tree.item(item, "values"))[4] == "None":
tree.delete(item)
else:
if float((tree.item(item, "values"))[4]) < 60:
tree.delete(item)
def modify_exam(self, tree):
pass
def exam_makeup(self): # 补考重修
if not self.handle: # 只有handle为False时(代表无该窗口存在)才能执行建立窗口的语句
self.handle = True
top = Toplevel(self.window)
self.window.withdraw()
# 居中显示
ScreenWid, ScreenHei = top.maxsize()
CurWid = 800
CurHeight = 600
cen_x = (ScreenWid - CurWid) / 2
cen_y = (ScreenHei - CurHeight) / 2
size_xy = '%dx%d+%d+%d' % (CurWid, CurHeight, cen_x, cen_y)
top.geometry(size_xy)
# ****************
top.title('补考重修')
top.protocol("WM_DELETE_WINDOW", lambda: self.quit(top))
tree = ttk.Treeview(top, show='headings', column=('sid', 'stu_name', 'cid', 'course_name', 'score'))
tree.place(rely=0.37, width=CurWid, relheight=0.6)
tree.column('sid', width=150, anchor="center")
tree.column('stu_name', width=200, anchor="center")
tree.column('cid', width=150, anchor="center")
tree.column('course_name', width=200, anchor="center")
tree.column('score', width=50, anchor="center")
tree.heading('sid', text='学号')
tree.heading('stu_name', text='姓名')
tree.heading('cid', text='课程号')
tree.heading('course_name', text='课程名')
tree.heading('score', text='成绩')
Label(top, text='学号:').grid(row=0, column=0, pady=5)
Label(top, text='姓名:').grid(row=1, column=0, pady=5)
Label(top, text='课程号:').grid(row=2, column=0, pady=5)
Label(top, text='课程名:').grid(row=3, column=0, pady=5)
Label(top, text='成绩:').grid(row=4, column=0, pady=5)
Entry(top, textvariable=self.sid).grid(row=0, column=1, pady=5, ipadx=60)
Entry(top, textvariable=self.name).grid(row=1, column=1, pady=5, ipadx=60)
Entry(top, textvariable=self.cid).grid(row=2, column=1, pady=5, ipadx=60)
Entry(top, textvariable=self.course_name).grid(row=3, column=1, pady=5, ipadx=60)
Entry(top, textvariable=self.score).grid(row=4, column=1, pady=5, ipadx=60)
Button(top, text='显示所有成绩信息', command=lambda: self.show_exam_makeup(tree)).grid(row=0, column=2, padx=200,
ipadx=35)
Button(top, text='更新学生成绩', command=lambda: self.update_exam_makeup(tree)).grid(row=1, column=2, padx=200,
ipadx=50)
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
cur.execute("insert into exam_makeup (sid,stu_name,cid,course_name) "
"select distinct sid,stu_name,cid,course_name from stu_course "
"where score < 60 and not exists (select * from exam_makeup)")
con.commit()
con.close()
cur.close()
def show_exam_makeup(self, tree):
x = tree.get_children()
for item in x:
tree.delete(item)
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
if self.user_handle: # 如果是学生则退出
cur.execute("select * from exam_makeup where sid = %s",self.user_name)
else:
cur.execute("select * from exam_makeup order by sid")
lst = cur.fetchall()
for item in lst:
tree.insert("", END, values=item) # END表示插入表格末尾
cur.close()
con.close()
def update_exam_makeup(self, tree):
if self.user_handle: # 如果是学生则退出
showinfo(title='提示', message='您没有操作权限')
return
ans = askyesno(title='提示', message='是否进行当前操作')
if ans is True:
if self.sid.get() == "" or self.cid.get() == "" or self.score.get() == "":
showerror(title='提示', message='请输入完整信息')
return
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
sql = "update exam_makeup set score = %s where sid = %s and cid = %s"
result = cur.execute(sql, (self.score.get(), self.sid.get(), self.cid.get()))
if result == 0:
showerror(title='提示', message='更新失败!')
else:
# 补考过了最终在stu_course中只能改为60
sql_2 = "update stu_course set score = 60 where sid = %s and cid = %s"
result_2 = cur.execute(sql_2, (self.sid.get(), self.cid.get()))
if result_2 == 0:
showerror(title='提示', message='更新失败!')
else:
con.commit()
showinfo(title='提示', message='更新成功!')
self.show_exam_makeup(tree)
cur.close()
con.close()
main.py:
import tkinter as tk
from tkinter import messagebox
from PIL import Image, ImageTk
import pymysql
# https://tkdocs.com/tutorial/index.html tk说明文档
from menu import menu
con = pymysql.connect(user='root', password='123', database='student', charset='utf8')
cur = con.cursor()
# 如果是 from tkinter import * 就不需要加前缀tk
window = tk.Tk()
# window.iconbitmap(default=r'pic.gif') # 这种方法只能应用ico格式的图片
# window.iconphoto(False,tk.PhotoImage(file='smile.png')) #这个样子不能使用jpg
window.iconphoto(False, ImageTk.PhotoImage(file='icon1.png')) # False代表他的子窗口不可以使用 #这样写好处在于可以用所有的图片格式
window.title('学生选课管理系统')
window.geometry('450x300')
# welcome image
# 参考博客
im_root = Image.open('nature.jpg').resize((450, 300))
img= ImageTk.PhotoImage(im_root)
imLabel = tk.Label(window, image=img).pack()
# canvas = tk.Canvas(window, height=450, width=300)
# image_file = tk.PhotoImage(file='pic.gif')
# canvas.create_image(400,300,image=im_root)
# canvas.pack()
# user information
tk.Label(window, text='User name:').place(relx=0.1,rely=0.5)
tk.Label(window, text='Password:').place(relx=0.1,rely=0.62)
# var_user_name=tk.StringVar()
# entry_user_name=tk.Entry(window,textvariable = var_user_name)
entry_user_name = tk.Entry(window)
var_user_name = entry_user_name.get()
entry_user_name.place(relx=0.31, rely=0.5)
# another method
entry_user_pwd = tk.Entry(window, show='*') # show='*'令密码输入显示为*
entry_user_pwd.place(relx=0.31, rely=0.62)
var_user_pwd = entry_user_pwd.get()
def usr_login():
user_name = entry_user_name.get() # 为啥不能直接用var_user_name跟var_user_pwd???
user_pwd = entry_user_pwd.get()
if user_name == 'admin' and user_pwd == '123':
# window.destroy()#quit跟destory
messagebox.showinfo(title='Welcome', message='How are you?')
window.destroy()
root = tk.Tk()
menu(root, False)
else:
result = cur.execute("select * from user_info where user_name = %s and password = %s", (user_name, user_pwd))
if result > 0:
messagebox.showinfo(title='Welcome', message='How are you?')
window.destroy()
root = tk.Tk()
menu(root, True, user_name)
def usr_register():
name = entry_user_name.get()
pwd = entry_user_pwd.get()
if name != "" and pwd != "":
result = cur.execute("select * from user_info where user_name = %s", name)
if result > 0:
messagebox.showerror(title='提示', message='用户已存在')
else:
result_2 = cur.execute("select * from stu_info where sid = %s", name)
if result_2 == 0:
messagebox.showerror(title='提示', message='您不是该学校学生,请输入您的学号进行注册')
else:
cur.execute("insert into user_info values(%s,%s)", (name, pwd))
con.commit()
btn_login = tk.Button(window, text='Login', command=usr_login)
btn_login.place(relx=0.3, rely=0.8) # relx/rely是相对位置,取值范围0~1
btn_register = tk.Button(window, text='Register', command=usr_register)
btn_register.place(relx=0.6, rely=0.8)
# con.close()
# cur.close()
window.mainloop()
用到的图片可以自行修改。