期末课程课设 thinker+mysql的可视化学生选课系统(文末附源码)

程序运行环境:

python 3及以上、tkinter库、pymysql连接mysql的第三方库

该选课系统分为管理员、教师、学生三个不同的角色;

先看打包成exe的程序运行的登录主界面效果图:

mysql表如下:分别为:课程表、管理员表、学生表、学生选课表、教师表、教师授课表


项目文件结构:

管理员登录成功后的界面:

管理员管理学生和教师及安排教师授课,管理员输入以下任意一个查询教师或者学生信息:

管理员创建学生或者教师账号:

管理员安排教师和课程,排课

学生端可以实现修改个人信息、选课、退课、以及查看课程分数

学生退课操作:

教师端功能:查看或者修改个人登录密码:

为选课学生打分:

当教师给出对应的课程分数后,学生登录即可看到自己的分数:

若需要新增课程:需要在tb_course表利新增课程:

 程序源代码:

腾讯文档腾讯文档-在线文档icon-default.png?t=N7T8https://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)
        

 

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一个简单的思考者界面学生管理系统Python代码示例: ```python import tkinter as tk class Student: def __init__(self, name, grade): self.name = name self.grade = grade class StudentManagementSystem: def __init__(self): self.students = [] def add_student(self, name, grade): student = Student(name, grade) self.students.append(student) def remove_student(self, student): self.students.remove(student) def get_student_by_name(self, name): for student in self.students: if student.name == name: return student def get_all_students(self): return self.students class App: def __init__(self): self.window = tk.Tk() self.window.title("学生管理系统") self.system = StudentManagementSystem() self.name_label = tk.Label(self.window, text="姓名:") self.name_label.pack() self.name_entry = tk.Entry(self.window) self.name_entry.pack() self.grade_label = tk.Label(self.window, text="年级:") self.grade_label.pack() self.grade_entry = tk.Entry(self.window) self.grade_entry.pack() self.add_button = tk.Button(self.window, text="添加学生", command=self.add_student) self.add_button.pack() self.remove_button = tk.Button(self.window, text="删除学生", command=self.remove_student) self.remove_button.pack() self.search_button = tk.Button(self.window, text="搜索学生", command=self.search_student) self.search_button.pack() self.show_all_button = tk.Button(self.window, text="显示所有学生", command=self.show_all_students) self.show_all_button.pack() self.result_label = tk.Label(self.window, text="") self.result_label.pack() def add_student(self): name = self.name_entry.get() grade = self.grade_entry.get() self.system.add_student(name, grade) def remove_student(self): name = self.name_entry.get() student = self.system.get_student_by_name(name) if student: self.system.remove_student(student) def search_student(self): name = self.name_entry.get() student = self.system.get_student_by_name(name) if student: self.result_label.config(text="姓名:{} 年级:{}".format(student.name, student.grade)) else: self.result_label.config(text="没有找到该学生") def show_all_students(self): students = self.system.get_all_students() if students: result = "" for student in students: result += "姓名:{} 年级:{}\n".format(student.name, student.grade) self.result_label.config(text=result) else: self.result_label.config(text="没有学生") def run(self): self.window.mainloop() if __name__ == "__main__": app = App() app.run() ``` 这个简单的学生管理系统使用了Tkinter库创建了一个简单的GUI界面,可以添加、删除、搜索和显示所有学生

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白不会debug

需要源码打个赏呗~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值