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()