程序运行环境:
python 3及以上、tkinter库、pymysql连接mysql的第三方库
该选课系统分为管理员、教师、学生三个不同的角色;
先看打包成exe的程序运行的登录主界面效果图:
mysql表如下:分别为:课程表、管理员表、学生表、学生选课表、教师表、教师授课表
项目文件结构:
管理员登录成功后的界面:
管理员管理学生和教师及安排教师授课,管理员输入以下任意一个查询教师或者学生信息:
管理员创建学生或者教师账号:
管理员安排教师和课程,排课
学生端可以实现修改个人信息、选课、退课、以及查看课程分数
学生退课操作:
教师端功能:查看或者修改个人登录密码:
为选课学生打分:
当教师给出对应的课程分数后,学生登录即可看到自己的分数:
若需要新增课程:需要在tb_course表利新增课程:
程序源代码:
腾讯文档腾讯文档-在线文档https://docs.qq.com/doc/p/71239d69a76f56cf1521717ae6b22c27cf876f10管理员端实现功能的代码:
import tkinter
from tkinter import ttk
from utils import *
import pymysql
RADIO = 0.1
WINDOW_SIZE = '800x500+200+100'
INFO_TEXT_INDENT = 60
INFO_TEXT_LINE_SPACE = 30
STUDENT = 0
TEACHER = 1
class menu:
def __init__(self, managerNum):
self.managerNum = managerNum
self.root = tkinter.Tk()
self.root.geometry(WINDOW_SIZE)
self.root.title('管理员')
self.root.resizable(False, False)
# 子区域
self.query = tkinter.Frame(self.root)
self.new = tkinter.Frame(self.root)
self.course = tkinter.Frame(self.root)
# 菜单栏
self.menu = tkinter.Frame(self.root)
self.mgr_query = tkinter.Button(self.menu, text='账号查询', command=self.mgr_query)
self.mgr_new = tkinter.Button(self.menu, text='新建账号', command=self.mgr_new)
self.mgr_course = tkinter.Button(self.menu, text='安排课程', command=self.mgr_course)
# 控件布局
self.initialize()
def initialize(self):
self.menu.place(relheight=1, relwidth=RADIO)
self.mgr_query.place(rely=0.0, relheight=1/3, relwidth=1)
self.mgr_new.place(rely=1/3, relheight=1/3, relwidth=1)
self.mgr_course.place(rely=2/3, relheight=1/3, relwidth=1)
def mgr_query(self):
self.new.place_forget()
self.course.place_forget()
mgrQuery(self.query, self.managerNum)
def mgr_new(self):
self.query.place_forget()
self.course.place_forget()
mgrNew(self.new, self.managerNum)
def mgr_course(self):
self.new.place_forget()
self.query.place_forget()
mgrCourse(self.course)
def start(self):
self.root.mainloop()
# 账号查询区域
class mgrQuery:
def __init__(self, frame, managerNum):
self.manager = managerNum
self.frame = frame
# 选择的表项
self.selected = None
# 选择的是学生还是教师
self.type = TEACHER
self.queryFrame = tkinter.Frame(self.frame)
self.numLabel = tkinter.Label(self.frame, text='学(工)号:')
self.nameLabel = tkinter.Label(self.frame, text='姓名:')
self.num_Entry = tkinter.Entry(self.frame, text='学(工)号:')
self.name_Entry = tkinter.Entry(self.frame)
self.queryButton = tkinter.Button(self.frame, text='查询', command=self.queryInfo)
# 提示信息
self.promptLabel = tkinter.Label(self.frame, text='输入一项或输入两项,不能为空')
self.infoScrollbar = tkinter.Scrollbar(self.frame)
self.infoTable = ttk.Treeview(self.frame,
height=10,
columns=['姓名', '学号', '性别'],
show='headings',
yscrollcommand=self.infoScrollbar.set)
# 显示查询到的账号信息
self.infoScrollbar = tkinter.Scrollbar(self.frame)
self.infoTable = ttk.Treeview(self.frame,
height=10,
columns=[1, 2, 3, 4],
show='headings',
yscrollcommand=self.infoScrollbar.set)
self.infoTable.heading(1, text='姓名')
self.infoTable.heading(2, text='学(工)号')
self.infoTable.heading(3, text='性别')
self.infoTable.heading(4, text='教师/学生')
self.infoTable.column(1, width=50, anchor='s')
self.infoTable.column(2, width=50, anchor='s')
self.infoTable.column(3, width=50, anchor='s')
self.infoTable.column(4, width=50, anchor='s')
# 显示学生(老师)选择的(教授)的课
self.courseScrollbar = tkinter.Scrollbar(self.frame)
self.courseTable = ttk.Treeview(master=self.frame,
height=10,
columns=[1, 2, 3, 4],
show='headings',
yscrollcommand=self.courseScrollbar.set)
self.courseTable.heading(1, text='课程号')
self.courseTable.heading(2, text='课程名')
self.courseTable.heading(3, text='课序号')
self.courseTable.heading(4, text='学分')
self.courseTable.column(1, width=50, anchor='s')
self.courseTable.column(2, width=75, anchor='s')
self.courseTable.column(3, width=50, anchor='s')
self.courseTable.column(4, width=50, anchor='s')
# 控件布局
self.initialize()
def initialize(self):
self.frame.place(relx=RADIO, relheight=1, relwidth=1-RADIO)
self.frame.update()
self.numLabel.place(x=0, y=0)
self.frame.update()
self.num_Entry.place(x=self.numLabel.winfo_x() + self.numLabel.winfo_width(), y=0)
self.frame.update()
self.nameLabel.place(x=self.num_Entry.winfo_x() + self.num_Entry.winfo_width() + 5, y=0)
self.frame.update()
self.name_Entry.place(x=self.nameLabel.winfo_x() + self.nameLabel.winfo_width(), y=0)
self.frame.update()
self.queryButton.place(x=self.name_Entry.winfo_x() + self.name_Entry.winfo_width(), y=0)
self.frame.update()
self.promptLabel.place(x=self.queryButton.winfo_x() + self.queryButton.winfo_width(), y=0)
# 放置信息框
self.frame.update()
self.infoTable.place(y=self.numLabel.winfo_y() + self.numLabel.winfo_height() + 10,
relheight=0.9,
relwidth=0.5)
self.frame.update()
self.courseTable.place(y=self.infoTable.winfo_y(),
x=self.infoTable.winfo_width(),
relheight=0.9,
relwidth=0.5)
def queryInfo(self):
if len(self.num_Entry.get()) == 0 and len(self.name_Entry.get()) == 0:
self.promptLabel.configure(text='至少一项不为空!!')
return
else:
if len(self.num_Entry.get()) == 0:
self.displayInfo(name=self.name_Entry.get())
elif len(self.name_Entry.get()) == 0:
self.displayInfo(ID=self.num_Entry.get())
else:
self.displayInfo(name=self.name_Entry.get(), ID=self.num_Entry.get())
def displayInfo(self, ID=None, name=None):
self.clear_table_info([self.infoTable, self.courseTable])
info = self.get_acc_info(ID, name)
if len(info) != 0:
self.promptLabel.configure(text='查询成功')
else:
self.promptLabel.configure(text='未查询到记录')
for x in info:
self.infoTable.insert('', tkinter.END, values=x)
self.infoTable.bind('<ButtonRelease-1>', self.click_acc)
# 显示课程
def displayCourse(self):
self.clear_table_info([self.courseTable])
info = self.selected['values']
info = self.get_acc_course(info[1], info[3])
for x in info:
self.courseTable.insert('', tkinter.END, values=x)
# 点击账号
def click_acc(self, event):
self.get_selected_acc(event)
self.displayCourse()
# 查询账号信息,以及学生0/教师1
def get_acc_info(self, ID=None, name=None):
if ID == None and name == None:
return None
else:
if ID == None:
sql1 = f'select teacherName, teacherID, teacherSex ' \
f'from tb_teacher ' \
f'where teacherName like \'%{name}%\''
sql2 = f'select studentName, studentID, studentSex ' \
f'from tb_student ' \
f'where studentName like \'%{name}%\''
elif name == None:
sql1 = f'select teacherName, teacherID, teacherSex ' \
f'from tb_teacher ' \
f'where teacherID = \'{ID}\''
sql2 = f'select studentName, studentID, studentSex ' \
f'from tb_student ' \
f'where studentID = \'{ID}\''
else:
sql1 = f'select teacherName, teacherID, teacherSex ' \
f'from tb_teacher ' \
f'where teacherName like \'%{name}%\' and teacherID = \'{ID}\''
sql2 = f'select studentName, studentID, studentSex ' \
f'from tb_student ' \
f'where studentName like \'%{name}%\' and studentID = \'{ID}\''
db = connect()
cursor = db.cursor()
# 先查教师再查学生
cursor.execute(sql1)
result = cursor.fetchall()
res = []
if len(result) != 0:
for x in result:
res.append((x[0], x[1], x[2], '教师'))
cursor.execute(sql2)
result = cursor.fetchall()
if len(result) != 0:
for x in result:
res.append((x[0], x[1], x[2], '学生'))
db.close()
return res
# 查询账号(老师/学生)对应课程
def get_acc_course(self, ID, type):
if type == '学生':
sql = f'select c.courseID, c.courseName, c.courseNum, c.courseCredit ' \
f'from tb_course as c, tb_student_course as sc ' \
f'where c.courseID = sc.courseID and c.courseNum = sc.courseNum and sc.studentID = \'{ID}\''
else:
sql = f'select c.courseID, c.courseName, c.courseNum, c.courseCredit ' \
f'from tb_course as c, tb_teacher_course as tc ' \
f'where c.courseID = tc.courseID and c.courseNum = tc.courseNum and tc.teacherID = \'{ID}\''
db = connect()
cursor = db.cursor()
cursor.execute(sql)
result = cursor.fetchall()
db.close()
return result
def get_selected_acc(self, event):
curItem = self.infoTable.focus()
self.selected = self.infoTable.item(curItem)
主页面登录的实现代码:
import tkinter
import student
import teacher
import manager
from utils import *
TEACHER = 0
STUDENT = 1
MANAGER = 2
class login:
def __init__(self):
self.root = tkinter.Tk()
self.root.title("用户登录界面")
self.root.geometry("300x200")
self.root.resizable(False, False)
self.user_label = tkinter.Label(self.root, text="用户ID")
self.user_entry = tkinter.Entry(self.root, width=15)
self.pswd_label = tkinter.Label(self.root, text="密码")
self.password_entry = tkinter.Entry(self.root, width=15, show='*')
self.star_button = tkinter.Button(self.root, text="登陆", command=self.login)
self.initialize()
def initialize(self):
self.user_label.grid(row=0, column=0)
self.user_entry.grid(row=0, column=1)
self.pswd_label.grid(row=1, column=0)
self.password_entry.grid(row=1, column=1)
self.star_button.grid(row=2, column=1)
self.user_entry.focus()
def judge(self):
login=self.user_entry.get()
password=self.password_entry.get()
if login.strip() == '' or password.strip() == '':
return 3, ()
db = connect()
cursor = db.cursor()
sql = "SELECT studentID FROM tb_student where studentID='%s' and studentPswd='%s'" % (login,password)
cursor.execute(sql)
result = cursor.fetchall()
if len(result)!=0:
return STUDENT, result[0][0]
else:
sql = "SELECT * FROM tb_teacher where teacherID='%s' and teacherPswd='%s'" % (login, password)
cursor.execute(sql)
result = cursor.fetchall()
print(type(result), result)
if len(result)!=0:
return TEACHER, result[0][0]
else:
sql = "SELECT managerID FROM tb_manager where managerID='%s' and managerPswd='%s'" % (login, password)
cursor.execute(sql)
result = cursor.fetchall()
if len(result)!=0:
return MANAGER, result[0][0]
else:
return MANAGER, result
def login(self):
type, result =self.judge()
if len(result)!=0:
self.root.destroy()
if type == STUDENT:
c=student.menu(result)
c.start()
elif type == TEACHER:
t=teacher.menu(result)
t.start()
else:
m=manager.menu(result)
m.start()
else:
tkinter.Label(self.root, text="用户名或密码错误,请重新输入").grid(row=3, column=1)
def start(self):
self.root.mainloop()
if __name__ == '__main__':
start = login()
start.start()
学生端代码:
import tkinter
from tkinter import ttk
import pymysql
from utils import *
RADIO = 0.1
WINDOW_SIZE = '800x500+200+100'
TEXT_INDENT = 60
TEXT_LINE_SPACE = 30
class menu:
def __init__(self, StudentNum):
self.studentNum = StudentNum
self.root = tkinter.Tk()
self.root.geometry(WINDOW_SIZE)
self.root.title('学生')
self.root.resizable(False, False)
# 子区域
self.info = tkinter.Frame(self.root)
self.choose = tkinter.Frame(self.root)
self.drop = tkinter.Frame(self.root)
self.grade = tkinter.Frame(self.root)
# 菜单栏
self.menu = tkinter.Frame(self.root)
self.stu_info = tkinter.Button(self.menu, text='个人信息', command=self.stu_info)
self.stu_choose = tkinter.Button(self.menu, text='选课', command=self.stu_choose)
self.stu_drop = tkinter.Button(self.menu, text='退课', command=self.stu_drop)
self.stu_grade = tkinter.Button(self.menu, text='课程成绩', command=self.stu_grade)
# 控件布局
self.initialize()
def initialize(self):
self.menu.place(relheight=1, relwidth=RADIO)
self.stu_info.place(rely=0.0, relheight=0.25, relwidth=1)
self.stu_choose.place(rely=0.25, relheight=0.25, relwidth=1)
self.stu_drop.place(rely=0.5, relheight=0.25, relwidth=1)
self.stu_grade.place(rely=0.75, relheight=0.25, relwidth=1)
def stu_info(self):
self.info.place_forget()
self.choose.place_forget()
self.drop.place_forget()
self.grade.place_forget()
stuInfo(self.info, self.studentNum)
def stu_choose(self):
self.info.place_forget()
self.choose.place_forget()
self.drop.place_forget()
self.grade.place_forget()
stuChoose(self.choose, self.studentNum)
def stu_drop(self):
self.info.place_forget()
self.choose.place_forget()
self.drop.place_forget()
self.grade.place_forget()
stuDrop(self.drop, self.studentNum)
def stu_grade(self):
self.info.place_forget()
self.choose.place_forget()
self.drop.place_forget()
self.grade.place_forget()
stuGrade(self.grade, self.studentNum)
# 启动窗口
def start(self):
self.root.mainloop()
# 个人信息区域
class stuInfo:
def __init__(self, frame, studentNum):
self.frame = frame
self.studentNum = studentNum
# 个人信息
self.numLabel = tkinter.Label(self.frame, text='学号:')
self.nameLabel = tkinter.Label(self.frame, text='姓名:')
self.sexLabel = tkinter.Label(self.frame, text='性别:')
self.ageLabel = tkinter.Label(self.frame, text='年龄:')
self.pswdLabel = tkinter.Label(self.frame, text='密码:')
# 个人信息显示
self.num_Label = tkinter.Label(self.frame)
self.name_Label = tkinter.Label(self.frame)
self.sex_Label = tkinter.Label(self.frame)
self.age_Label = tkinter.Label(self.frame)
self.pswdVar = tkinter.StringVar()
self.pswd_Entry = tkinter.Entry(self.frame, textvariable=self.pswdVar)
# 修改密码
self.commitButton = tkinter.Button(self.frame, text='修改密码')
# 规则提示,修改密码提示信息是同一个标签
self.promptLabel = tkinter.Label(self.frame, text='密码不少于6位, 不能与原密码相同', font=("TkDefaultFont", 8))
# 控件布局
self.initialize()
def initialize(self):
self.frame.place(relx=RADIO, relheight=1, relwidth=1-RADIO)
# 放置不变的组件
self.numLabel.place(x=TEXT_INDENT, y=TEXT_LINE_SPACE * 0, anchor='ne')
self.nameLabel.place(x=TEXT_INDENT, y=TEXT_LINE_SPACE * 1, anchor='ne')
self.sexLabel.place(x=TEXT_INDENT, y=TEXT_LINE_SPACE * 2, anchor='ne')
self.ageLabel.place(x=TEXT_INDENT, y=TEXT_LINE_SPACE * 3, anchor='ne')
self.pswdLabel.place(x=TEXT_INDENT, y=TEXT_LINE_SPACE * 4, anchor='ne')
# 获取信息
info = self.get_student_info(self.studentNum)[0]
# 设置要显示的信息,及修改密码的函数
self.num_Label.configure(text=info[0])
self.name_Label.configure(text=info[1])
self.sex_Label.configure(text=info[2])
self.age_Label.configure(text=info[3])
self.pswd_Entry.insert(tkinter.INSERT, info[4])
self.commitButton.configure(command=lambda :self.change_pswd(info[4], self.pswd_Entry.get()))
# 放置组件,显示信息
self.num_Label.place(x=TEXT_INDENT, y=TEXT_LINE_SPACE * 0)
self.name_Label.place(x=TEXT_INDENT, y=TEXT_LINE_SPACE * 1)
self.sex_Label.place(x=TEXT_INDENT, y=TEXT_LINE_SPACE * 2)
self.age_Label.place(x=TEXT_INDENT, y=TEXT_LINE_SPACE * 3)
self.pswd_Entry.place(x=TEXT_INDENT, y=TEXT_LINE_SPACE * 4)
# 放置修改密码按钮,和密码提示
self.frame.update()
self.promptLabel.place(x=self.pswd_Entry.winfo_x(), y=self.pswd_Entry.winfo_y() + self.pswd_Entry.winfo_height() + 5)
self.commitButton.place(x=self.pswd_Entry.winfo_x() + self.pswd_Entry.winfo_width() + 5, y=self.pswd_Entry.winfo_y() - 5)
def change_pswd(self, origPswd, pswd):
pswd = pswd.strip()
if pswd == origPswd:
self.promptLabel.configure(text='密码不能与原密码相同!')
return
elif len(pswd) < 6:
self.promptLabel.configure(text='密码不能小于六位!')
return
else:
self.promptLabel.configure(text='密码修改成功!')
self.set_student_pswd(pswd)
return
def get_student_info(self, studentID):
db = connect()
cursor = db.cursor()
sql = f'select distinct * from tb_student where studentID = \'{studentID}\''
cursor.execute(sql)
result = cursor.fetchall()
db.close()
return result
def set_student_pswd(self, pswd):
db = connect()
cursor = db.cursor()
sql = f'UPDATE tb_student SET studentPswd= \'{pswd}\' WHERE studentID = \'{self.studentNum}\''
cursor.execute(sql)
try:
db.commit()
except Exception as e:
db.rollback()
db.close()
教师端实现的代码:
import tkinter
from tkinter import ttk
import pymysql
from utils import *
RADIO = 0.1
WINDOW_SIZE = '800x500+200+100'
TEXT_INDENT = 60
TEXT_LINE_SPACE = 30
# 个人信息区域
class menu:
def __init__(self, teacherID):
self.studentNum = teacherID
self.root = tkinter.Tk()
self.root.geometry(WINDOW_SIZE)
self.root.title('教师')
self.root.resizable(False, False)
# 子区域
self.info = tkinter.Frame(self.root)
self.course = tkinter.Frame(self.root)
self.grade = tkinter.Frame(self.root)
self.input = tkinter.Frame(self.root)
# 菜单栏
self.menu = tkinter.Frame(self.root)
self.tc_info = tkinter.Button(self.menu, text='个人信息', command=self.tea_info)
self.tc_grade = tkinter.Button(self.menu, text='课程成绩', command=self.tea_grade)
# 控件布局
self.initialize()
def initialize(self):
self.menu.place(relheight=1, relwidth=RADIO)
self.tc_info.place(rely=0.0, relheight=0.5, relwidth=1)
self.tc_grade.place(rely=0.5, relheight=0.5, relwidth=1)
def tea_info(self):
self.course.place_forget()
self.grade.place_forget()
self.input.place_forget()
tcInfo(self.info, self.studentNum)
def tea_grade(self):
self.course.place_forget()
self.info.place_forget()
self.input.place_forget()
tcGrade(self.grade, self.studentNum)
def start(self):
self.root.mainloop()
# 个人信息区域
class tcInfo:
def __init__(self, frame, teacherID):
self.teacherID = teacherID
self.frame = frame
# 个人信息
self.numLabel = tkinter.Label(self.frame, text='学号:')
self.nameLabel = tkinter.Label(self.frame, text='姓名:')
self.sexLabel = tkinter.Label(self.frame, text='性别:')
self.pswdLabel = tkinter.Label(self.frame, text='密码:')
# 个人信息显示
self.num_Label = tkinter.Label(self.frame)
self.name_Label = tkinter.Label(self.frame)
self.sex_Label = tkinter.Label(self.frame)
self.pswdVar = tkinter.StringVar()
self.pswd_Entry = tkinter.Entry(self.frame, textvariable=self.pswdVar)
# 修改密码
self.commitButton = tkinter.Button(self.frame, text='修改密码')
# 规则提示,修改密码提示信息是同一个标签
self.promptLabel = tkinter.Label(self.frame, text='密码不少于6位, 不能与原密码相同', font=("TkDefaultFont", 8))
# 控件布局
self.initialize()
def initialize(self):
self.frame.place(relx=RADIO, relheight=1, relwidth=1-RADIO)
# 放置不变的组件
self.numLabel.place(x=TEXT_INDENT, y=TEXT_LINE_SPACE * 0, anchor='ne')
self.nameLabel.place(x=TEXT_INDENT, y=TEXT_LINE_SPACE * 1, anchor='ne')
self.sexLabel.place(x=TEXT_INDENT, y=TEXT_LINE_SPACE * 2, anchor='ne')
self.pswdLabel.place(x=TEXT_INDENT, y=TEXT_LINE_SPACE * 3, anchor='ne')
# 获取信息
info = self.get_teacher_info(self.teacherID)[0]
# 设置要显示的信息,及修改密码的函数
self.num_Label.configure(text=info[0])
self.name_Label.configure(text=info[1])
self.sex_Label.configure(text=info[2])
self.pswd_Entry.insert(tkinter.INSERT, info[3])
self.commitButton.configure(command=lambda :self.change_pswd(info[3], self.pswd_Entry.get()))
# 放置组件,显示信息
self.num_Label.place(x=TEXT_INDENT, y=TEXT_LINE_SPACE * 0)
self.name_Label.place(x=TEXT_INDENT, y=TEXT_LINE_SPACE * 1)
self.sex_Label.place(x=TEXT_INDENT, y=TEXT_LINE_SPACE * 2)
self.pswd_Entry.place(x=TEXT_INDENT, y=TEXT_LINE_SPACE * 3)
# 放置修改密码按钮,和密码提示
self.frame.update()
self.promptLabel.place(x=self.pswd_Entry.winfo_x(), y=self.pswd_Entry.winfo_y() + self.pswd_Entry.winfo_height() + 5)
self.commitButton.place(x=self.pswd_Entry.winfo_x() + self.pswd_Entry.winfo_width() + 5, y=self.pswd_Entry.winfo_y() - 5)
def change_pswd(self, origPswd, pswd):
pswd = pswd.strip()
if pswd == origPswd:
self.promptLabel.configure(text='密码不能与原密码相同!')
return
elif len(pswd) < 6:
self.promptLabel.configure(text='密码不能小于六位!')
return
else:
self.promptLabel.configure(text='密码修改成功!')
self.set_teacher_pswd(pswd)
return
def get_teacher_info(self, teacherID):
db = connect()
cursor = db.cursor()
sql = f'select distinct * from tb_teacher where teacherID = \'{teacherID}\''
cursor.execute(sql)
result = cursor.fetchall()
db.close()
return result
def set_teacher_pswd(self, pswd):
db = connect()
cursor = db.cursor()
sql = f'UPDATE tb_teacher SET studentPswd= \'{pswd}\' WHERE teacherID = \'{self.teacherID}\''
cursor.execute(sql)
try:
db.commit()
except:
db.rollback()
db.close()
# 课程成绩区域
class tcGrade:
def __init__(self, frame, teacherID):
self.teacherID = teacherID
self.frame = frame
# 信息放置处
self.courseTable = ttk.Treeview(self.frame,
height=10,
columns=['课程号', '课程名', '课序号', '学分', '人数'],
show='headings')
self.studentTable = ttk.Treeview(self.frame,
height=10,
columns=[1, 2, 3],
show='headings')
# 提示信息
self.promptLabel = tkinter.Label(self.frame, text='点击列表中的课程,查看成绩')
self.gradeEntry = tkinter.Entry(self.frame)
self.enterButton = tkinter.Button(self.frame, text='修改成绩', command=self.inputGrade)
# 选中的课程
self.selectedCourse = None
self.selectedStudent = None
self.initialize()
def initialize(self):
self.frame.place(relx=RADIO, relheight=1, relwidth=1-RADIO)
# 放置组件
self.frame.update()
self.courseTable.place(height=self.frame.winfo_height(),
relwidth=0.6)
self.studentTable.place(relx=0.6, relheight=0.8,
relwidth=0.4)
self.frame.update()
self.promptLabel.place(x=self.courseTable.winfo_x() + self.courseTable.winfo_width() + 5,
y=self.courseTable.winfo_y() + self.courseTable.winfo_height(), anchor='sw')
self.gradeEntry.place(x=self.courseTable.winfo_x() + self.courseTable.winfo_width() + 5,
y=self.courseTable.winfo_y() + self.courseTable.winfo_height() - 60, anchor='sw')
self.enterButton.place(x=self.courseTable.winfo_x() + self.courseTable.winfo_width() + 5,
y=self.courseTable.winfo_y() + self.courseTable.winfo_height() - 30, anchor='sw')
self.displayInfo()
self.studentTable.heading(1, text='姓名', anchor='w')
self.studentTable.heading(2, text='学号')
self.studentTable.heading(3, text='成绩')
self.studentTable.column(1, width=00)
self.studentTable.column(2, width=50)
self.studentTable.column(3, width=50)
# 显示教授课程信息
# 只显示已有同学选择的课程
def displayInfo(self):
self.clear_table([self.studentTable, self.courseTable])
self.selectedStudent = None
self.courseTable.heading('课程号', text='课程号', anchor='w')
self.courseTable.heading('课程名', text='课程名')
self.courseTable.heading('课序号', text='课序号')
self.courseTable.heading('学分', text='学分')
self.courseTable.heading('人数', text='人数')
self.courseTable.column('课程号', width=100, minwidth=100)
self.courseTable.column('课程名', width=150, minwidth=150)
self.courseTable.column('课序号', width=50, minwidth=50)
self.courseTable.column('学分', width=50, minwidth=50)
self.courseTable.column('人数', width=50, minwidth=50)
info = self.get_class_teached()
for x in info:
self.courseTable.insert('', tkinter.END, values=x)
self.courseTable.bind('<ButtonRelease-1>', self.click_course)