MySQL數據庫大作業——學生管理系統GUI


MySQL數據庫大作業——學生管理系統GUI

原程序鏈接: 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()

程序末尾


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM