原程序链接: https://www.bbsmax.com/A/kmzL3WQBdG/
为了完成数据库大作业, 我在其基础上进行了一定的修改和扩充.
如果要使用的话, 请修改__init__
中的数据库登录信息,把其中的*****
修改成自己的信息即可。
主界面会自动分辨学生与教工账号,直接登录即可。
数据库中表的建立:
# student create table student( sno char(8) primary key, sname char(8) not null, sex char(2), birthday date, tel varchar(20) # student_course create table student_course( sno char(8) not null, tcid smallint not null, score tinyint) # course create table course( cno char(10) primary key, cname char(20) not null, credit tinyint not null) # teacher create table student( sno char(8) primary key, sname char(8) not null, sex char(2), birthday date, tel varchar(20)) # student_pwd create table student_pwd( user char(8) primary key, pwd varchar(40) not null) # teacher_pwd create table teacher_pwd( user char(8) primary key, pwd varchar(40) not null)
重要!!
使用程序之前,请先使用MySQL创建一个teacher账号。
需要同时在teacher表、teacher_pwd表中键入信息。
(pwd表中的user即为教工工号或学生学号)
from tkinter import * import pymysql from tkinter import messagebox # 消息提示框 from tkinter import ttk class Basedesk: """ 基准框模块 """ def __init__(self, master): # 主界面 self.root = master # 窗口传入 self.root.config() # 顶层菜单 self.root.title('教务管理系统') self.width = 600 # 界面宽 self.height = 300 # 界面高 # 获取屏幕尺寸以计算布局参数,使窗口居屏幕中央 self.screenwidth = self.root.winfo_screenwidth() # 屏幕宽 self.screenheight = self.root.winfo_screenheight() # 屏幕高 self.alignstr = '%dx%d+%d+%d' % ( self.width, self.height, (self.screenwidth - self.width) / 2, (self.screenheight - self.height) / 2) self.root.geometry(self.alignstr) # 进入应用 self.R = Register(self.root) self.R.register() class Register: def __init__(self, master): self.root = master # 窗口传入 # 数据库登录 self.ip = '*****' self.port = ***** self.id = '*****' self.pd = '*****' self.db = '*****' # 个人信息 self.no = '' self.name = '' self.sex = '' self.birthday = '' self.tel = '' self.flag = 0 # 临时变量(click单击后选择的变量 smanage中) self.temporary_sno = '' self.temporary_sname = '' self.temporary_sex = '' self.temporary_birth = '' self.temporary_tel = '' self.temporary_pwd = '' self.temporary_cno = '' self.temporary_cname = '' ''' 登录模块 ''' def register(self): # 账号密码输入框 self.initface = LabelFrame(self.root, text='教务系统登录', font=('微软雅黑', 16)) self.initface.grid(row=1, column=0, padx=170, pady=30, ) self.people = Label(self.initface, text='账号 :', font=('黑体', 12)) # 账号 self.people.grid(row=1, column=0, padx=20, pady=10, sticky=W) self.password = Label(self.initface, text='密码 :', font=('黑体', 12)) # 密码 self.password.grid(row=2, column=0, padx=20, pady=10, sticky=W) self.var1 = StringVar self.var2 = StringVar self.entry_people = Entry(self.initface, textvariable=self.var1) # 账号输入框 self.entry_people.grid(row=1, column=1, padx=10, pady=10) self.entry_password = Entry(self.initface, textvariable=self.var2, show='*') # 密码输入框 self.entry_password.grid(row=2, column=1, padx=10, pady=10) self.button_into = Button(self.initface, text='登录', command=self.conn) # 登录按钮 self.button_into.grid(row=3, column=0, padx=10, pady=20, sticky=E) self.button_into = Button(self.initface, text='退出', command=self.root.quit) # 退出按钮 self.button_into.grid(row=3, column=1, padx=20, pady=20, ) # ======= register的登录 def conn(self): self.connect = pymysql.connect(host=self.ip, port=self.port, user=self.id, passwd=self.pd, db=self.db) self.cursor = self.connect.cursor() if self.connect: print('连接成功') self.ssql = "select * " \ "from student_pwd " \ "where user=%s and pwd=%s" % (self.entry_people.get(), self.entry_password.get()) self.tsql = "select * " \ "from teacher_pwd " \ "where user=%s and pwd=%s" % (self.entry_people.get(), self.entry_password.get()) # 学生登录 self.flag = 0 self.cursor.execute(self.ssql) self.result = self.cursor.fetchone() # 查询 if self.result: print('账号密码正确') self.flag = 1 self.no = self.result[0] self.initface.destroy() # 销毁initface self.check() else: # 教工登录 self.cursor.execute(self.tsql) self.result = self.cursor.fetchone() # 查询 if self.result: print('账号密码正确') self.flag = 2 self.no = self.result[0] self.initface.destroy() # 销毁initface self.check() # 若均未登录成功 if self.flag == 0: # 账号或密码错误清空输入框 self.entry_people.delete(0, END) self.entry_password.delete(0, END) messagebox.showinfo(title='提示', message='账号或密码输入错误\n请重新输入?') self.cursor.close() self.connect.close() # self.no = self.entry_people.get() # 获取框中用户名 # self.pd = self.entry_password.get() # 获取框中密码 ''' 选择模块 ''' # 登录conn之后, 进入check界面 def check(self): # 查询并记录基本信息 self.basic() # self.no self.name self.sex self.sex self.birthday self.tel self.label_basic = Label(self.root, text='\n' '学号/工号: %s\n\n' '姓名: %s\n\n' '性别: %s\n\n' '出生日期: %s\n\n' '联系方式: %s\n\n' % (self.no, self.name, self.sex, self.birthday, self.tel), font=('宋体', 10) ) self.label_basic.grid(row=0, columnspan=4, padx=230) # 界面 self.frame_checkbutton = LabelFrame(self.root, text='功能选择', font=('微软雅黑', 14)) self.frame_checkbutton.grid(padx=60, pady=10) if self.flag == 1: # 查询成绩按钮 self.button_success = Button(self.frame_checkbutton, text='查询成绩', width=10, height=2, command=self.success) self.button_success.grid(row=1, column=0, padx=20, pady=20) # 选择课程按钮 self.button_select = Button(self.frame_checkbutton, text='选课', width=10, height=2, command=self.select) self.button_select.grid(row=1, column=1, padx=20, pady=20) elif self.flag == 2: # 学生管理按钮 以及成绩管理 self.button_smanage = Button(self.frame_checkbutton, text='学生管理', width=10, height=2, command=self.smanage) self.button_smanage.grid(row=1, column=0, padx=20, pady=20) # 课程管理按钮 self.button_cmanage = Button(self.frame_checkbutton, text='课程管理', width=10, height=2, command=self.cmanage) self.button_cmanage.grid(row=1, column=1, padx=20, pady=20) # 修改密码按钮 self.button_revise = Button(self.frame_checkbutton, text='修改密码', width=10, height=2, command=self.revise) self.button_revise.grid(row=1, column=2, padx=20, pady=20) # 修改信息按钮 self.button_select = Button(self.frame_checkbutton, text='修改信息', width=10, height=2, command=self.update) self.button_select.grid(row=1, column=3, padx=20, pady=20) # 使用basic以记录基本信息 def basic(self): # 链接数据库 self.connect = pymysql.connect(host=self.ip, port=self.port, user=self.id, passwd=self.pd, db=self.db) if self.connect: print('连接成功') print(self.no) # 用户名, 即学号/工号 # 查询语句 search_sql = '' if self.flag == 1: search_sql = "select * " \ "from student " \ "where sno=%s" % self.no elif self.flag == 2: search_sql = "select * " \ "from teacher " \ "where tno=%s" % self.no # 创建游标 self.cursor1 = self.connect.cursor() self.cursor1.execute(search_sql) self.row = self.cursor1.fetchone() # 读取查询结果 self.name = self.row[1] self.sex = self.row[2] self.birthday = self.row[3] self.tel = self.row[4] self.row = () # 查询结果置空 # 查询成绩界面 def success(self): # 链接数据库 self.connect = pymysql.connect(host=self.ip, port=self.port, user=self.id, passwd=self.pd, db=self.db) if self.connect: print('连接成功') print(self.no) # 用户名, 即学号 # 查询语句 search_sql = "select c.cno,cname,score " \ "from student_course sc " \ "inner join course c " \ "on sc.cno=c.cno " \ "where sno=%s" % self.no # 创建游标 self.cursor1 = self.connect.cursor() self.cursor1.execute(search_sql) self.row = self.cursor1.fetchone() # 读取查询结果 # 表格框 root = Tk() # 初始框的声明 root.geometry('500x400+100+100') root.title('成绩查询系统') columns = ("姓名", "学号", "课程", "成绩") self.treeview = ttk.Treeview(root, height=18, show="headings", columns=columns) self.treeview.column("姓名", width=150, anchor='center') # 表示列,不显示 self.treeview.column("学号", width=100, anchor='center') self.treeview.column("课程", width=150, anchor='center') self.treeview.column("成绩", width=100, anchor='center') self.treeview.heading("姓名", text="姓名") # 显示表头 self.treeview.heading("学号", text="学号") self.treeview.heading("课程", text="课程") self.treeview.heading("成绩", text="成绩") self.treeview.pack(side=LEFT, fill=BOTH) # 插入查询结果 while self.row: self.treeview.insert('', 0, values=(self.name, self.no, self.row[1], self.row[2])) self.row = self.cursor1.fetchone() self.cursor1.close() self.connect.close() root.mainloop() # 修改密码界面 def revise(self): self.window = Tk() # 初始框的声明 self.window.geometry('400x200+100+100') self.window.title('密码修改管理') self.frame_revise = LabelFrame(self.window) self.frame_revise.grid(padx=60, pady=60) self.label_revise = Label(self.frame_revise, text='新密码:') self.label_revise.grid(row=0, column=0, padx=10, pady=10) self.var3 = StringVar self.entry_revise = Entry(self.frame_revise, textvariable=self.var3) self.entry_revise.grid(row=0, column=1, padx=10, pady=10) self.button_ok = Button(self.frame_revise, text='确定', command=self.revise_ok) self.button_ok.grid(row=1, column=0) self.button_resive = Button(self.frame_revise, text='取消', command=self.revise_resive) self.button_resive.grid(row=1, column=1) self.button_quit = Button(self.frame_revise, text='退出', command=self.window.destroy) self.button_quit.grid(row=1, column=2) # ======= revise的"确定"按钮 def revise_ok(self): # 连接数据库 self.connect = pymysql.connect(host=self.ip, port=self.port, user=self.id, passwd=self.pd, db=self.db) self.cursor2 = self.connect.cursor() # 创建游标 sql_revise = '' if self.flag == 1: sql_revise = "update student_pwd " \ "set pwd=%s " \ "where user=%s" % (self.entry_revise.get(), self.no) elif self.flag == 2: sql_revise = "update teacher_pwd " \ "set pwd=%s " \ "where user=%s" % (self.entry_revise.get(), self.no) if self.connect: print('连接成功') print(self.no) self.cursor2.execute(sql_revise) self.connect.commit() print(self.entry_revise.get()) messagebox.showinfo(title='提示', message='密码修改成功!') self.cursor2.close() self.connect.close() # ======= revise的"取消"按钮 def revise_resive(self): self.entry_revise.delete(0, END) # 选择课程界面 def select(self): # 链接数据库 self.connect = pymysql.connect(host=self.ip, port=self.port, user=self.id, passwd=self.pd, db=self.db) if self.connect: print('连接成功') print(self.no) # 用户名, 即学号 # 查询语句 search_sql1 = "select * from course " search_sql2 = "select c.cno,cname,credit " \ "from student_course sc " \ "inner join course c " \ "on sc.cno=c.cno " \ "where sno=%s " % self.no # 创建游标 self.cursor1 = self.connect.cursor() # 初始框的声明 root_select = Tk() root_select.geometry('700x500+100+100') root_select.title('选课系统') # 所有课程表格框 columns = ("编号", "课程", "学分") self.treeview1 = ttk.Treeview(root_select, height=18, show="headings", columns=columns) self.treeview1.column("编号", width=50, anchor='center') # 表示列,不显示 self.treeview1.column("课程", width=75, anchor='center') self.treeview1.column("学分", width=50, anchor='center') # self.treeview.column("成绩", width=100, anchor='center') self.treeview1.heading("编号", text="编号") # 显示表头 self.treeview1.heading("课程", text="课程") self.treeview1.heading("学分", text="学分") # self.treeview.heading("成绩", text="成绩") self.treeview1.grid(row=1, column=0, rowspan=3) # 插入查询结果 self.cursor1.execute(search_sql1) self.row = self.cursor1.fetchone() # 读取查询结果 while self.row: self.treeview1.insert('', 0, values=(self.row[0], self.row[1], self.row[2])) self.row = self.cursor1.fetchone() # 已选课程表格框 self.treeview2 = ttk.Treeview(root_select, height=18, show="headings", columns=columns) self.treeview2.column("编号", width=50, anchor='center') # 表示列,不显示 self.treeview2.column("课程", width=75, anchor='center') self.treeview2.column("学分", width=50, anchor='center') self.treeview2.heading("编号", text="编号") # 显示表头 self.treeview2.heading("课程", text="课程") self.treeview2.heading("学分", text="学分") self.treeview2.grid(row=1, column=1, rowspan=3) # 插入查询结果 self.cursor1.execute(search_sql2) self.row = self.cursor1.fetchone() # 读取查询结果 while self.row: self.treeview2.insert('', 0, values=(self.row[0], self.row[1], self.row[2])) self.row = self.cursor1.fetchone() # 标签 self.label_selectcourse1 = Label(root_select, text='学校开设课程表') self.label_selectcourse1.grid(row=0, column=0, padx=10, pady=10) self.label_selectcourse2 = Label(root_select, text='已选课程表') self.label_selectcourse2.grid(row=0, column=1, padx=10, pady=10) # 按钮框 self.frame_selectbutton = LabelFrame(root_select, text='选课', font=('微软雅黑', 14)) self.frame_selectbutton.grid(row=0, column=2, padx=10, pady=10, rowspan=4) # 输入框 self.var4 = StringVar self.entry_insert = Entry(self.frame_selectbutton, textvariable=self.var4) self.entry_insert.grid(row=2, column=2, padx=10, pady=10) # 插入课程按钮 self.button_insert = Button(self.frame_selectbutton, text='选择', width=10, height=2, command=self.select_insert) self.button_insert.grid(row=3, column=2, padx=10, pady=10) # Label self.label_selectcourse3 = Label(self.frame_selectbutton, text="输入要选择的课程编号: ") self.label_selectcourse3.grid(row=1, column=2, padx=10, pady=10) self.cursor1.close() self.connect.close() root_select.mainloop() # 修改信息界面 def update(self): self.window = Tk() self.window.geometry('400x400') self.window.title('更新个人信息') self.varno = StringVar(self.window, value=self.no) self.varname = StringVar(self.window, value=self.name) self.varsex = StringVar(self.window, value=self.sex) self.varbirth = StringVar(self.window, value=self.birthday) self.vartel = StringVar(self.window, value=self.tel) # 输入框展示个人信息 self.entry_no = Entry(self.window, textvariable=self.varno, state='disabled') # 账号输入框 self.entry_no.grid(row=1, column=1, padx=10, pady=10) self.entry_name = Entry(self.window, textvariable=self.varname) # 名字输入框 self.entry_name.grid(row=2, column=1, padx=10, pady=10) self.entry_sex = Entry(self.window, textvariable=self.varsex) # 性别输入框 self.entry_sex.grid(row=3, column=1, padx=10, pady=10) self.entry_birth = Entry(self.window, textvariable=self.varbirth) # birth输入框 self.entry_birth.grid(row=4, column=1, padx=10, pady=10) self.entry_tel = Entry(self.window, textvariable=self.vartel) self.entry_tel.grid(row=5, column=1, padx=10, pady=10) # Label输入框 self.label_no = Label(self.window, text='学号/工号:', font=('黑体', 12)) self.label_no.grid(row=1, column=0, padx=10, pady=10) self.label_name = Label(self.window, text='姓名:', font=('黑体', 12)) self.label_name.grid(row=2, column=0, padx=10, pady=10) self.label_sex = Label(self.window, text='性别:', font=('黑体', 12)) self.label_sex.grid(row=3, column=0, padx=10, pady=10) self.label_birth = Label(self.window, text='生日:', font=('黑体', 12)) self.label_birth.grid(row=4, column=0, padx=10, pady=10) self.label_tel = Label(self.window, text='联系方式:', font=('黑体', 12)) self.label_tel.grid(row=5, column=0, padx=10, pady=10) # Lable个人信息 self.label_info = Label(self.window, text='\n' '学号/工号: %s\n\n' '姓名: %s\n\n' '性别: %s\n\n' '出生日期: %s\n\n' '联系方式: %s\n\n' % (self.no, self.name, self.sex, self.birthday, self.tel), font=('宋体', 10) ) self.label_info.grid(row=0, column=0, columnspan=2, padx=20, pady=10, sticky=W) # 更新按钮 self.button_update = Button(self.window, text='更新', width=10, height=2, command=self.update_up) self.button_update.grid(row=2, column=2, padx=10, pady=10, rowspan=3) self.window.mainloop() # ======= select的"选课"按钮 def select_insert(self): # 连接数据库 self.connect = pymysql.connect(host=self.ip, port=self.port, user=self.id, passwd=self.pd, db=self.db) self.cursor2 = self.connect.cursor() # 创建游标 # 查询输入课程是否存在 sql_insert1 = "select * " \ "from course " \ "where cno=%s" % self.entry_insert.get() # 插入/忽略课程 sql_insert2 = "insert ignore into student_course " \ "(sno, cno) values " \ "(%s, %s);" % (self.no, self.entry_insert.get()) if self.connect: print('连接成功') self.cursor2.execute(sql_insert1) self.result = self.cursor2.fetchone() if self.result: self.cursor2.execute(sql_insert2) self.connect.commit() messagebox.showinfo(title='提示', message='已添加/已存在!') else: messagebox.showinfo(title='提示', message='请输入正确的课程编号!') self.cursor2.close() self.connect.close() # ======= update的"修改信息"按钮 def update_up(self): # 连接数据库 self.connect = pymysql.connect(host=self.ip, port=self.port, user=self.id, passwd=self.pd, db=self.db) self.cursor2 = self.connect.cursor() # 创建游标 sql_up = '' if self.flag == 1: sql_up = "update student " \ "set sname=\'%s\', sex=\'%s\', birthday=\'%s\', tel=%s " \ "where sno=%s;" % \ (self.entry_name.get(), self.entry_sex.get(), self.entry_birth.get(), self.entry_tel.get(), self.no) elif self.flag == 2: sql_up = "update teacher " \ "set tname=\'%s\', sex=\'%s\', birthday=\'%s\', tel=%s " \ "where tno=%s;" % \ (self.entry_name.get(), self.entry_sex.get(), self.entry_birth.get(), self.entry_tel.get(), self.no) if self.connect: print('连接成功') print(self.no) self.cursor2.execute(sql_up) self.connect.commit() messagebox.showinfo(title='提示', message='信息修改成功!') self.cursor2.close() self.connect.close() # 学生管理界面 def smanage(self): # 链接数据库 self.connect = pymysql.connect(host=self.ip, port=self.port, user=self.id, passwd=self.pd, db=self.db) if self.connect: print('连接成功') print(self.no) # 用户名, 即学号 # 查询语句 search_sql1 = "select sno, sname, sex, birthday, tel, pwd " \ "from student " \ "inner join student_pwd " \ "where sno=user " # 创建游标 self.cursor2 = self.connect.cursor() # 初始框的声明 root_smanage = Tk() root_smanage.geometry("1150x550+100+100") root_smanage.title("学生管理系统") # 学生管理表格框 columns = ("学号", "姓名", "性别", "生日", "电话", "密码") self.treeview3 = ttk.Treeview(root_smanage, height=18, show="headings", columns=columns) self.treeview3.column("学号", width=80, anchor='center') # 表示列,不显示 self.treeview3.column("姓名", width=70, anchor='center') self.treeview3.column("性别", width=50, anchor='center') self.treeview3.column("生日", width=100, anchor='center') self.treeview3.column("电话", width=80, anchor='center') self.treeview3.column("密码", width=70, anchor='center') self.treeview3.heading("学号", text="学号") # 显示表头 self.treeview3.heading("姓名", text="姓名") self.treeview3.heading("性别", text="性别") self.treeview3.heading("生日", text="生日") self.treeview3.heading("电话", text="电话") self.treeview3.heading("密码", text="密码") self.treeview3.grid(row=1, column=0, rowspan=8, padx=10) # 插入查询结果 self.cursor2.execute(search_sql1) self.row = self.cursor2.fetchone() # 读取查询结果 while self.row: self.treeview3.insert('', 0, values=( self.row[0], self.row[1], self.row[2], self.row[3], self.row[4], self.row[5])) self.row = self.cursor2.fetchone() # 该生成绩显示表格框 columns = ("学号", "课程号", "课程", "成绩") self.treeview4 = ttk.Treeview(root_smanage, height=18, show="headings", columns=columns) self.treeview4.column("学号", width=80, anchor='center') # 表示列,不显示 self.treeview4.column("课程号", width=70, anchor='center') self.treeview4.column("课程", width=100, anchor='center') self.treeview4.column("成绩", width=50, anchor='center') self.treeview4.heading("学号", text="学号") # 显示表头 self.treeview4.heading("课程号", text="课程号") self.treeview4.heading("课程", text="课程") self.treeview4.heading("成绩", text="成绩") self.treeview4.grid(row=1, column=1, rowspan=8, columnspan=3) # 框框 self.frame_update = LabelFrame(root_smanage, text='修改信息', font=('微软雅黑', 16)) self.frame_update.grid(row=0, column=6, padx=10, pady=10, rowspan=5) # 标签 self.label_smanage1 = Label(root_smanage, text='学生表') self.label_smanage1.grid(row=0, column=0, padx=10, pady=10) self.label_smanage2 = Label(root_smanage, text='该生成绩表') self.label_smanage2.grid(row=0, column=2, padx=10, pady=10) self.label_score = Label(root_smanage, text='该科成绩:') self.label_score.grid(row=9, column=1, padx=10, pady=10) self.label_smanage_no = Label(self.frame_update, text='学号') self.label_smanage_no.grid(row=0, column=0, padx=10, pady=10) self.label_smanage_name = Label(self.frame_update, text='姓名') self.label_smanage_name.grid(row=1, column=0, padx=10, pady=10) self.label_smanage_sex = Label(self.frame_update, text='性别') self.label_smanage_sex.grid(row=2, column=0, padx=10, pady=10) self.label_smanage_birth = Label(self.frame_update, text='生日') self.label_smanage_birth.grid(row=3, column=0, padx=10, pady=10) self.label_smanage_tel = Label(self.frame_update, text='电话') self.label_smanage_tel.grid(row=4, column=0, padx=10, pady=10) self.label_smanage_pwd = Label(self.frame_update, text='密码') self.label_smanage_pwd.grid(row=5, column=0, padx=10, pady=10) # 按钮 self.button_delete = Button(root_smanage, text='删除该学生', width=20, height=2, command=self.smanage_delete) self.button_delete.grid(row=9, column=0, padx=20, pady=20) self.button_score = Button(root_smanage, text='成绩更新', width=10, height=1, command=self.smanage_score) self.button_score.grid(row=9, column=3, padx=10, pady=10) self.button_smanage_insert = Button(root_smanage, text='插入学生', width=20, height=2, command=self.smanage_insert) self.button_smanage_insert.grid(row=5, column=6, padx=20, pady=20, rowspan=5) self.button_smanage_update = Button(self.frame_update, text="确定修改", width=10, height=1, command=self.smanage_update) self.button_smanage_update.grid(row=6, column=0, columnspan=2, padx=10, pady=10) # 输入框 self.varscore = StringVar self.var_smanage_no = StringVar self.var_smanage_name = StringVar self.var_smanage_sex = StringVar self.var_smanage_birth = StringVar self.var_smanage_tel = StringVar self.var_smanage_pwd = StringVar self.entry_score = Entry(root_smanage, textvariable=self.varscore) self.entry_score.grid(row=9, column=2, padx=15, pady=10) self.entry_smanage_no = Entry(self.frame_update, textvariable=self.var_smanage_no) self.entry_smanage_no.grid(row=0, column=1, padx=15, pady=10) self.entry_smanage_name = Entry(self.frame_update, textvariable=self.var_smanage_name) self.entry_smanage_name.grid(row=1, column=1, padx=15, pady=10) self.entry_smanage_sex = Entry(self.frame_update, textvariable=self.var_smanage_sex) self.entry_smanage_sex.grid(row=2, column=1, padx=15, pady=10) self.entry_smanage_birth = Entry(self.frame_update, textvariable=self.var_smanage_birth) self.entry_smanage_birth.grid(row=3, column=1, padx=15, pady=10) self.entry_smanage_tel = Entry(self.frame_update, textvariable=self.var_smanage_tel) self.entry_smanage_tel.grid(row=4, column=1, padx=15, pady=10) self.entry_smanage_pwd = Entry(self.frame_update, textvariable=self.var_smanage_no) self.entry_smanage_pwd.grid(row=5, column=1, padx=15, pady=10) # 单击---显示该生详细信息 def treeview_click1(event): print('单击') item_text = [] if self.treeview3.selection(): # 获取学生表展示信息值 for item in self.treeview3.selection(): item_text = self.treeview3.item(item, "values") print(item_text[0]) # 绑定 self.temporary_sno = item_text[0] self.temporary_sname = item_text[1] self.temporary_sex = item_text[2] self.temporary_birth = item_text[3] self.temporary_tel = item_text[4] self.temporary_pwd = item_text[5] # 查询成绩 search_sql2 = "select c.cno,cname,score " \ "from student_course sc " \ "inner join course c " \ "on sc.cno=c.cno " \ "where sno=%s" % self.temporary_sno self.cursor2.execute(search_sql2) self.row = self.cursor2.fetchone() # 读取查询结果 del_button(self.treeview4) while self.row: self.treeview4.insert('', 0, values=(self.temporary_sno, self.row[0], self.row[1], self.row[2])) self.row = self.cursor2.fetchone() # 修改信息栏里显示信息 self.entry_smanage_no.delete(0, "end") self.entry_smanage_no.insert(0, self.temporary_sno) self.entry_smanage_name.delete(0, "end") self.entry_smanage_name.insert(0, self.temporary_sname) self.entry_smanage_sex.delete(0, "end") self.entry_smanage_sex.insert(0, item_text[2]) self.entry_smanage_birth.delete(0, "end") self.entry_smanage_birth.insert(0, item_text[3]) self.entry_smanage_tel.delete(0, "end") self.entry_smanage_tel.insert(0, item_text[4]) self.entry_smanage_pwd.delete(0, "end") self.entry_smanage_pwd.insert(0, item_text[5]) # 清空该科成绩框 self.entry_score.delete(0, "end") self.treeview3.bind('<ButtonRelease-1>', treeview_click1) # 绑定单击离开事件 # 单击---显示该科成绩 def treeview_click2(event): print('单击') item_text = [] if self.treeview4.selection(): for item in self.treeview4.selection(): item_text = self.treeview4.item(item, "values") print(item_text[0]) self.temporary_cname = item_text[2] self.temporary_cno = item_text[1] self.entry_score.delete(0, "end") self.entry_score.insert(0, item_text[3]) self.treeview4.bind('<ButtonRelease-1>', treeview_click2) # 绑定单击离开事件 root_smanage.mainloop() # 课程管理界面 def cmanage(self): self.connect = pymysql.connect(host=self.ip, port=self.port, user=self.id, passwd=self.pd, db=self.db) if self.connect: print('连接成功') print(self.no) # 用户名, 即学号 # 查询语句 search_sql1 = "select cno, cname, credit " \ "from course " # 创建游标 self.cursor2 = self.connect.cursor() # 初始框的声明 root_cmanage = Tk() root_cmanage.geometry("500x500+100+100") root_cmanage.title("课程管理系统") # 学生管理表格框 columns = ("课程号", "名称", "学分") self.treeview5 = ttk.Treeview(root_cmanage, height=18, show="headings", columns=columns) self.treeview5.column("课程号", width=80, anchor='center') # 表示列,不显示 self.treeview5.column("名称", width=70, anchor='center') self.treeview5.column("学分", width=50, anchor='center') self.treeview5.heading("课程号", text="课程号") # 显示表头 self.treeview5.heading("名称", text="名称") self.treeview5.heading("学分", text="学分") self.treeview5.grid(row=1, column=0, rowspan=3, padx=10, pady=3) # 插入查询结果 self.cursor2.execute(search_sql1) self.row = self.cursor2.fetchone() # 读取查询结果 while self.row: self.treeview5.insert('', 0, values=(self.row[0], self.row[1], self.row[2])) self.row = self.cursor2.fetchone() # 框框 self.frame_cmanage = LabelFrame(root_cmanage, text='修改课程', font=('微软雅黑', 16)) self.frame_cmanage.grid(row=1, column=1, padx=10, pady=10) # 标签 self.label_cmanage1 = Label(root_cmanage, text='课程表') self.label_cmanage1.grid(row=0, column=0, padx=10, pady=10) self.label_cmanage_cno = Label(self.frame_cmanage, text='课程号:') self.label_cmanage_cno.grid(row=0, column=0, padx=10, pady=10) self.label_cmanage_cname = Label(self.frame_cmanage, text='课程名:') self.label_cmanage_cname.grid(row=1, column=0, padx=10, pady=10) self.label_cmanage_credit = Label(self.frame_cmanage, text='学分:') self.label_cmanage_credit.grid(row=2, column=0, padx=10, pady=10) # 按钮 self.button_cmanage1 = Button(root_cmanage, text='选中课程删除', width=10, height=1, command=self.cmanage_delete) self.button_cmanage1.grid(row=4, column=0, padx=20, pady=20) self.button_cmanage_update = Button(self.frame_cmanage, text='确定修改', width=10, height=1, command=self.cmanage_update) self.button_cmanage_update.grid(row=4, column=0, padx=20, pady=20, columnspan=2) self.button_cmanage_insert = Button(root_cmanage, text='添加课程', width=20, height=2, command=self.cmanage_insert) self.button_cmanage_insert.grid(row=2, column=1, padx=10, pady=10) # 输入框 self.var_cno = StringVar self.var_cname = StringVar self.var_credit = StringVar self.entry_cno = Entry(self.frame_cmanage, textvariable=self.var_cno) self.entry_cno.grid(row=0, column=1, padx=10, pady=10) self.entry_cname = Entry(self.frame_cmanage, textvariable=self.var_cname) self.entry_cname.grid(row=1, column=1, padx=10, pady=10) self.entry_credit = Entry(self.frame_cmanage, textvariable=self.var_credit) self.entry_credit.grid(row=2, column=1, padx=10, pady=10) def treeview_click1(event): print('单击') item_text = [] if self.treeview5.selection(): # 获取课程表展示信息值 for item in self.treeview5.selection(): item_text = self.treeview5.item(item, "values") print(item_text[0]) self.temporary_cno = item_text[0] # 修改信息栏里显示信息 self.entry_cno.delete(0, "end") self.entry_cno.insert(0, item_text[0]) self.entry_cname.delete(0, "end") self.entry_cname.insert(0, item_text[1]) self.entry_credit.delete(0, "end") self.entry_credit.insert(0, item_text[2]) self.treeview5.bind('<ButtonRelease-1>', treeview_click1) # 绑定单击离开事件 root_cmanage.mainloop() # ======== smanage中"删除该生"按钮 def smanage_delete(self): if self.temporary_sno != '': # 链接数据库 self.connect = pymysql.connect(host=self.ip, port=self.port, user=self.id, passwd=self.pd, db=self.db) if self.connect: print('连接成功') print(self.no) # 用户名, 即学号 # 查询语句 update_sql1 = "delete " \ "from student " \ "where sno=%s " % self.temporary_sno update_sql2 = "delete " \ "from student_pwd " \ "where user=%s " % self.temporary_sno # 创建游标 self.cursor2 = self.connect.cursor() self.cursor2.execute(update_sql1) self.connect.commit() self.cursor2.execute(update_sql2) self.connect.commit() messagebox.showinfo(title='提示', message='删除成功!') # 重置treeview3 del_button(self.treeview3) search_sql1 = "select sno, sname, sex, birthday, tel, pwd " \ "from student " \ "inner join student_pwd " \ "where sno=user " self.cursor2.execute(search_sql1) self.row = self.cursor2.fetchone() # 读取查询结果 while self.row: self.treeview3.insert('', 0, values=( self.row[0], self.row[1], self.row[2], self.row[3], self.row[4], self.row[5])) self.row = self.cursor2.fetchone() else: messagebox.showinfo(title='提示', message='未选中, 请选中学生') # ======== smanage中"更新成绩"按钮 def smanage_score(self): if self.entry_score.get() != '': # 连接数据库 self.connect = pymysql.connect(host=self.ip, port=self.port, user=self.id, passwd=self.pd, db=self.db) self.cursor2 = self.connect.cursor() # 创建游标 if self.connect: print('连接成功') print(self.no) sql_student_score = "update student_course " \ "set score=%s " \ "where sno=%s and cno=%s;" % \ (self.entry_score.get(), self.temporary_sno, self.temporary_cno) self.cursor2.execute(sql_student_score) self.connect.commit() messagebox.showinfo(title='提示', message='成绩更新成功!') # 重置treeview4 del_button(self.treeview4) search_sql2 = "select c.cno,cname,score " \ "from student_course sc " \ "inner join course c " \ "on sc.cno=c.cno " \ "where sno=%s" % self.temporary_sno self.cursor2.execute(search_sql2) self.row = self.cursor2.fetchone() # 读取查询结果 while self.row: self.treeview4.insert('', 0, values=(self.temporary_sno, self.row[0], self.row[1], self.row[2])) self.row = self.cursor2.fetchone() else: messagebox.showinfo(title='提示', message='请勿更新空成绩!') # ========= smanage中的"修改信息"按钮 def smanage_update(self): if self.entry_smanage_no.get() == self.temporary_sno: self.connect = pymysql.connect(host=self.ip, port=self.port, user=self.id, passwd=self.pd, db=self.db) self.cursor2 = self.connect.cursor() # 创建游标 sql_up = "update student " \ "set sname='%s', sex='%s', birthday='%s', tel=%s " \ "where sno=%s; " % (self.entry_smanage_name.get(), self.entry_smanage_sex.get(), self.entry_smanage_birth.get(), self.entry_smanage_tel.get(), self.temporary_sno) if self.connect: print('连接成功') print(self.no) self.cursor2.execute(sql_up) self.connect.commit() sql_up2 = "update student_pwd " \ "set pwd=%s " \ "where user=%s ;" % (self.entry_smanage_pwd.get(), self.temporary_sno) self.cursor2.execute(sql_up2) self.connect.commit() messagebox.showinfo(title='提示', message='课程信息修改成功!') # 修改treeview3中值 sql_up3 = "select sno, sname, sex, birthday, tel, pwd " \ "from student " \ "inner join student_pwd " \ "where sno=user " del_button(self.treeview3) self.cursor2.execute(sql_up3) self.row = self.cursor2.fetchone() while self.row: self.treeview3.insert('', 0, values=(self.row[0], self.row[1], self.row[2], self.row[3], self.row[4], self.row[5])) self.row = self.cursor2.fetchone() else: messagebox.showinfo(title='提示', message='请勿修改学号!') # ========= smanage中的插入学生界面 def smanage_insert(self): root.window = Tk() # 初始框的声明 root.window.geometry('300x250+100+100') root.window.title('添加学生') # 框框 self.frame_smanage_insert = LabelFrame(root.window) self.frame_smanage_insert.grid(padx=30, pady=30) # Label self.label_smanage_insert_sno = Label(self.frame_smanage_insert, text='学号:') self.label_smanage_insert_sno.grid(row=0, column=0, padx=10, pady=10) self.label_smanage_insert_sname = Label(self.frame_smanage_insert, text='姓名:') self.label_smanage_insert_sname.grid(row=1, column=0, padx=10, pady=10) self.label_smanage_insert_pwd = Label(self.frame_smanage_insert, text='初始密码为学号!') self.label_smanage_insert_pwd.grid(row=2, column=0, columnspan=2, padx=10, pady=10) # 输入框 self.var_smanage_insert_sno = StringVar self.var_smanage_insert_sname = StringVar self.entry_smanage_insert_sno = Entry(self.frame_smanage_insert, textvariable=self.var_smanage_insert_sno) self.entry_smanage_insert_sno.grid(row=0, column=1, padx=10, pady=10) self.entry_smanage_insert_sname = Entry(self.frame_smanage_insert, textvariable=self.var_smanage_insert_sname) self.entry_smanage_insert_sname.grid(row=1, column=1, padx=10, pady=10) # 按钮 self.button_ok = Button(self.frame_smanage_insert, text='确定', command=self.smanage_insert_ok) self.button_ok.grid(row=3, column=0, columnspan=2, padx=10, pady=10) # ========= smanage_insert中的"插入学生"按钮 def smanage_insert_ok(self): # 连接数据库 self.connect = pymysql.connect(host=self.ip, port=self.port, user=self.id, passwd=self.pd, db=self.db) self.cursor2 = self.connect.cursor() # 创建游标 sql_insert1 = "insert into student " \ "(sno, sname) values " \ "(%s, '%s') ;" % (self.entry_smanage_insert_sno.get(), self.entry_smanage_insert_sname.get()) if self.connect: print('连接成功') print(self.no) self.cursor2.execute(sql_insert1) self.connect.commit() sql_insert2 = "insert into student_pwd " \ "(user, pwd) values " \ "(%s, %s) ;" % (self.entry_smanage_insert_sno.get(), self.entry_smanage_insert_sno.get()) self.cursor2.execute(sql_insert2) self.connect.commit() messagebox.showinfo(title='提示', message='插入成功!') # 修改treeview3中信息 sql_insert3 = "select sno, sname, sex, birthday, tel, pwd " \ "from student " \ "inner join student_pwd " \ "where sno=user " del_button(self.treeview3) self.cursor2.execute(sql_insert3) self.row = self.cursor2.fetchone() while self.row: self.treeview3.insert('', 0, values=(self.row[0], self.row[1], self.row[2], self.row[3], self.row[4], self.row[5])) self.row = self.cursor2.fetchone() # ========= cmanage中"删除课程"按钮 def cmanage_delete(self): # 链接数据库 self.connect = pymysql.connect(host=self.ip, port=self.port, user=self.id, passwd=self.pd, db=self.db) if self.connect: print('连接成功') print(self.no) # 用户名, 即工号 # 查询语句 update_sql1 = "delete " \ "from course " \ "where cno=%s " % self.temporary_cno update_sql2 = "delete " \ "from student_course " \ "where cno=%s " % self.temporary_cno # 创建游标 self.cursor2 = self.connect.cursor() self.cursor2.execute(update_sql1) self.connect.commit() self.cursor2.execute(update_sql2) self.connect.commit() messagebox.showinfo(title='提示', message='删除成功!') # 重置treeview5 del_button(self.treeview5) search_sql1 = "select cno, cname, credit " \ "from course " # 插入查询结果 self.cursor2.execute(search_sql1) self.row = self.cursor2.fetchone() # 读取查询结果 while self.row: self.treeview5.insert('', 0, values=(self.row[0], self.row[1], self.row[2])) self.row = self.cursor2.fetchone() # ========= cmanage中插入课程界面 def cmanage_insert(self): root.window = Tk() # 初始框的声明 root.window.geometry('300x250+100+100') root.window.title('添加课程') # 框框 self.frame_cmanage_insert = LabelFrame(root.window) self.frame_cmanage_insert.grid(padx=30, pady=30) # Label self.label_cmanage_insert_cno = Label(self.frame_cmanage_insert, text='课程号:') self.label_cmanage_insert_cno.grid(row=0, column=0, padx=10, pady=10) self.label_cmanage_insert_cname = Label(self.frame_cmanage_insert, text='课程名:') self.label_cmanage_insert_cname.grid(row=1, column=0, padx=10, pady=10) self.label_cmanage_insert_credit = Label(self.frame_cmanage_insert, text='学分:') self.label_cmanage_insert_credit.grid(row=2, column=0, padx=10, pady=10) # 输入框 self.var_cmanage_insert_cno = StringVar self.var_cmanage_insert_cname = StringVar self.var_cmanage_insert_credit = StringVar self.entry_cmanage_insert_cno = Entry(self.frame_cmanage_insert, textvariable=self.var_cmanage_insert_cno) self.entry_cmanage_insert_cno.grid(row=0, column=1, padx=10, pady=10) self.entry_cmanage_insert_cname = Entry(self.frame_cmanage_insert, textvariable=self.var_cmanage_insert_cname) self.entry_cmanage_insert_cname.grid(row=1, column=1, padx=10, pady=10) self.entry_cmanage_insert_credit = Entry(self.frame_cmanage_insert, textvariable=self.var_cmanage_insert_credit) self.entry_cmanage_insert_credit.grid(row=2, column=1, padx=10, pady=10) # 按钮 self.button_ok = Button(self.frame_cmanage_insert, text='确定', command=self.cmanage_insert_ok) self.button_ok.grid(row=3, column=0, columnspan=2, padx=10, pady=10) # ========= cmanage中"更新"按钮 def cmanage_update(self): if self.entry_cno.get() == self.temporary_cno: self.connect = pymysql.connect(host=self.ip, port=self.port, user=self.id, passwd=self.pd, db=self.db) self.cursor2 = self.connect.cursor() # 创建游标 sql_up = "update course " \ "set cname='%s', credit=%s " \ "where cno=%s; " % (self.entry_cname.get(), self.entry_credit.get(), self.temporary_cno) if self.connect: print('连接成功') print(self.no) self.cursor2.execute(sql_up) self.connect.commit() messagebox.showinfo(title='提示', message='信息修改成功!') # 修改treeview5中值 sql_up3 = "select cno, cname, credit " \ "from course " del_button(self.treeview5) # 插入查询结果 self.cursor2.execute(sql_up3) self.row = self.cursor2.fetchone() # 读取查询结果 while self.row: self.treeview5.insert('', 0, values=(self.row[0], self.row[1], self.row[2])) self.row = self.cursor2.fetchone() else: messagebox.showinfo(title='提示', message='请勿修改课程号!') def cmanage_insert_ok(self): # 连接数据库 self.connect = pymysql.connect(host=self.ip, port=self.port, user=self.id, passwd=self.pd, db=self.db) self.cursor2 = self.connect.cursor() # 创建游标 sql_insert1 = "insert into course " \ "(cno, cname, credit) values " \ "(%s, '%s', %s) ;" % \ (self.entry_cmanage_insert_cno.get(), self.entry_cmanage_insert_cname.get(), self.entry_cmanage_insert_credit.get()) if self.connect: print('连接成功') print(self.no) self.cursor2.execute(sql_insert1) self.connect.commit() messagebox.showinfo(title='提示', message='插入成功!') # 修改treeview5中值 sql_up3 = "select cno, cname, credit " \ "from course " del_button(self.treeview5) # 插入查询结果 self.cursor2.execute(sql_up3) self.row = self.cursor2.fetchone() # 读取查询结果 while self.row: self.treeview5.insert('', 0, values=(self.row[0], self.row[1], self.row[2])) self.row = self.cursor2.fetchone() # 清空treeview def del_button(tree): x = tree.get_children() for item in x: tree.delete(item) if __name__ == '__main__': # 初始化Tk() root = Tk() Basedesk(root) # 进入消息循环 mainloop() mainloop()