這是一個比較綜合性的程序,要求能運用GUI 和麪向對象的方法來編程,同時涉及到數據的讀寫(文本或mysql)和保存。工
程結構: 學生明細:
================================GUI界面設計===============================
========================運行界面============================
=======================實現代碼=========================
1.GUI-- basedetail.py
from tkinter import *
from tkinter.ttk import *
class BaseDetail(Toplevel): # 彈出窗體模板
def __init__(self):
super().__init__()
self.geometry("600x600+700+150")
self.resizable(0, 0)
self.iconbitmap() # 添加一個彈窗
self["bg"] = "lightgray"
# 準備一個Style
self.Style01 = Style()
self.Style01.configure("Title.TLabel", font=("微軟雅黑", 26, "bold"), forground="Navy", background="lightblue")
self.Style01.configure("TPanedwindow", background="SkyBlue")
self.Style01.configure("TButton", font=("微軟雅黑", 10, "bold"), forground="Navy")
# 加載top_banner
self.Login_image = PhotoImage(file="../file/stu_top_banner01.jpg")
self.Label_image = Label(self, image=self.Login_image)
self.Label_image.place(x=0, y=0)
# 加載一個標題label
self.Label_Title = Label(self, text="", style="Title.TLabel")
self.Label_Title.place(x=20, y=30)
# 添加一個pane
self.Pane_detail = Panedwindow(self, width=588, height=420)
self.Pane_detail.place(x=6, y=110)
# 添加保存按鈕
self.Button_save = Button(self, text="保存", width=10, command=self.commit)
self.Button_save.place(x=300, y=550)
# 添加關閉按鈕
self.Button_close = Button(self, text="關閉", width=10, command=self.close_gui)
self.Button_close.place(x=450, y=550)
def close_gui(self):
self.destroy()
def commit(self):
pass
if __name__ == '__main__':
basedeatil = BaseDetail()
basedeatil.mainloop()
2. GUI-- maingui.py
from tkinter import *
from tkinter.ttk import *
from fileoperator import *
from studentdetail import *
from tkinter.messagebox import *
from basedetail import *
from teacherdetail import *
class MainGUI(Tk):
def __init__(self):
super().__init__()
self.title("學生教師信息管理系統")
self.geometry("1400x600+100+100")
self.resizable(0, 0)
# 實例化File 讀取學生和教師信息到系統中
self.file_info = File()
self.student_all = self.file_info.list_student_all
self.teacher_all = self.file_info.list_teacher_all
self.student_current = []
self.flag = 0
# 定義一個Style
self.Style01 = Style()
self.Style01.configure("TLabel", font=("微軟雅黑", 14, "bold"), foreground="Navy")
# 學生和教師的標籤
self.Label_student = Label(self, text="學生信息列表:")
self.Label_student.place(x=40, y=60)
self.Label_teacher = Label(self, text="教師信息列表")
self.Label_teacher.place(x=720, y=60)
# 添加學生表格
self.student_gui()
# 添加教師表格
self.teacher_gui()
# ==========學生明細按鈕===============
# 添加按鈕
self.Button_add_student = Button(self, text="添加", width=10, command=self.add_student)
self.Button_add_student.place(x=400, y=550)
# 修改按鈕
self.Button_add_student = Button(self, text="修改", width=10, command=self.update_student)
self.Button_add_student.place(x=500, y=550)
# 刪除按鈕
self.Button_add_student = Button(self, text="刪除", width=10, command=self.delete_student)
self.Button_add_student.place(x=600, y=550)
# ==========教師明細按鈕===============
# 添加按鈕
self.Button_add_teacher = Button(self, text="添加", width=10, command=self.add_teacher)
self.Button_add_teacher.place(x=1080, y=550)
# 修改按鈕
self.Button_add_teacher = Button(self, text="修改", width=10, command=self.update_teacher)
self.Button_add_teacher.place(x=1180, y=550)
# 刪除按鈕
self.Button_add_teacher = Button(self, text="刪除", width=10, command=self.delete_teacher)
self.Button_add_teacher.place(x=1280, y=550)
# 雙擊表格某一行觸發的事件
self.Tree_student.bind("<Double-1>", self.view_student)
# 雙擊表格某一行觸發的事件
self.Tree_teacher.bind("<Double-1>", self.view_teacher)
# 把窗體關閉按鈕的行爲轉化爲方法
self.protocol("WM_DELETE_WINDOW", self.close_windows)
self.load_student_treeview()
self.load_teacher_treeview()
def student_gui(self): # 添加treeview控件
self.Tree_student = Treeview(self, column=("sno", "sname", "gender", "profession", "mobile", "email"),
show="headings", height=20)
# 設置每一列對其方式
self.Tree_student.column("sno", width=80, anchor="center")
self.Tree_student.column("sname", width=80, anchor="center")
self.Tree_student.column("gender", width=60, anchor="center")
self.Tree_student.column("profession", width=120, anchor="center")
self.Tree_student.column("mobile", width=150, anchor="center")
self.Tree_student.column("email", width=150, anchor="center")
# 設置每列的標題
self.Tree_student.heading("sno", text="學號")
self.Tree_student.heading("sname", text="姓名")
self.Tree_student.heading("gender", text="性別")
self.Tree_student.heading("profession", text="專業")
self.Tree_student.heading("mobile", text="手機號碼")
self.Tree_student.heading("email", text="郵箱地址")
# 展示表格
self.Tree_student.place(x=35, y=95)
def teacher_gui(self):
# 添加treeview控件
self.Tree_teacher= Treeview(self, columns=("tid", "name", "gender", "title", "college", "mobile"),
show="headings", height=20)
# 設置每一列對其方式
self.Tree_teacher.column("tid", width=80, anchor="center")
self.Tree_teacher.column("name", width=80, anchor="center")
self.Tree_teacher.column("gender", width=60, anchor="center")
self.Tree_teacher.column("title", width=120, anchor="center")
self.Tree_teacher.column("college", width=150, anchor="center")
self.Tree_teacher.column("mobile", width=150, anchor="center")
# 設置每列的標題
self.Tree_teacher.heading("tid", text="員工號")
self.Tree_teacher.heading("name", text="姓名")
self.Tree_teacher.heading("gender", text="性別")
self.Tree_teacher.heading("title", text="職稱")
self.Tree_teacher.heading("college", text="畢業院校")
self.Tree_teacher.heading("mobile", text="手機號碼")
# 展示表格
self.Tree_teacher.place(x=720, y=95)
def load_student_treeview(self):
"""
將student info 導入 treeview
:return:
"""
# 先把當前 treeview 內容清空
for index in self.Tree_student.get_children():
self.Tree_student.delete(index)
# 加載list 中的數據
if len(self.student_all) == 0:
showinfo("系統消息:", "沒有任何學生信息加載到表格!!")
else:
for index in range(len(self.student_all)):
self.Tree_student.insert("", index, values=(self.student_all[index][0], self.student_all[index][1],
self.student_all[index][2], self.student_all[index][6],
self.student_all[index][4], self.student_all[index][5]))
def load_teacher_treeview(self):
"""
將 teacher info 導入 treeview
:return:
"""
# 先把當前 treeview 內容清空
for index in self.Tree_teacher.get_children():
self.Tree_teacher.delete(index)
# 加載list 中的數據
if len(self.teacher_all) == 0:
showinfo("系統消息:", "沒有任何老師信息加載到表格!!")
else:
for index in range(len(self.teacher_all)):
self.Tree_teacher.insert("", index, values=(self.teacher_all[index][0], self.teacher_all[index][1],
self.teacher_all[index][2], self.teacher_all[index][6],
self.teacher_all[index][7], self.teacher_all[index][4]))
def view_student(self, event):
"""
雙擊某一行加載明細信息
:return:
"""
# 修改flag
self.flag = 1
# 獲取點擊的當前行
item = self.Tree_student.selection()[0] # 獲得雙擊行的ID
currtent_student = self.Tree_student.item(item, "values") # 根據ID 取出Values
for item in self.student_all:
if currtent_student[0] == item[0]:
self.student_current = item
# 以查看的方法加載
StudentDetail(self.flag, self.student_all, self.student_current)
# detail = StudentDetail(self.flag, self.student_all, self.student_current)
def update_student(self):
"""
修改某一行加載明細信息
:return:
"""
# 修改flag
self.flag = 2
# 獲取點擊的當前行
item = self.Tree_student.selection()[0]
currtent_student = self.Tree_student.item(item, "values") # 根據ID 取出Values
for item in self.student_all:
if currtent_student[0] == item[0]:
self.student_current = item
# 以查看的方法加載
detail = StudentDetail(self.flag, self.student_all, self.student_current)
# 接收反饋並刷新表格
self.wait_window(detail)
# 接收 返回的值
get_return_number = detail.userinfo
# 如果值爲1 刷新
if get_return_number == 1:
self.load_student_treeview()
def add_student(self):
"""
新增學生明細
:return:
"""
# 修改flag
self.flag = 3
# 加載添加的頁面
detail = StudentDetail(self.flag, self.student_all, self.student_current)
self.wait_window(detail)
# 接收返回的值
get_return_number = detail.userinfo
# 判斷值爲1 刷新
if get_return_number == 1:
self.load_student_treeview()
def delete_student(self):
"""
刪除學生信息
:return:
"""
# 獲取雙擊行的數據
item = self.Tree_student.selection()[0]
Temp_student_list = self.Tree_student.item(item, "values")
student_object = ""
for item in self.student_all:
if Temp_student_list[0] == item[0]:
# 封裝到student
student_object = Student(item[0], item[1], item[2], item[3],
item[4], item[5], item[6], item[7])
# 實例化studentservices
current_student_services = StudentServices(self.student_all, student_object)
# 詢問是否刪除
choose = askyesno("刪除確認", "確認要刪除學生信息【學號:" + student_object.sno + "姓名:" + student_object.name + "】信息嗎?" )
if choose:
# 執行刪除操作
# for index in range(len(self.student_all)):
# if self.student_all[index][0] == Temp_student_list[0]:
# self.student_all.pop(index)
# break
current_student_services.delete()
showinfo("系統消息", "刪除成功!")
# 更新表格
self.load_student_treeview()
else:
return 0
def close_windows(self):
showinfo("系統提醒:", "關閉窗體")
# 詢問是否保存修改
choose = askyesno("關閉前的提醒", "關閉窗體前是否要降修改寫入到文件?")
if choose:
try:
self.file_info.write_to_file()
showinfo("系統提示:", "所有的修改意見寫入到文件!")
self.destroy()
except Exception as e:
showinfo("系統消息:", e)
else:
showinfo("系統提示:", "所有修改不會寫入文件!")
self.destroy()
def view_teacher(self, event):
"""
雙擊某一行加載明細信息
:return:
"""
# 1) 修改flag
self.flag = 4
# 獲取點擊的當前行
item = self.Tree_teacher.selection()[0] # 獲得雙擊行的ID
current_teacher = self.Tree_teacher.item(item, "values") # 根據ID 取出Values
for item in self.teacher_all:
if current_teacher[0] == item[0]:
self.teacher_current = item
# 以查看的方法加載
detail = TeacherDetail(self.flag, self.teacher_all, self.teacher_current)
def update_teacher(self):
"""
修改某一行加載明細信息
:return:
"""
# 修改某一行加載明細信息
self.flag = 5
# 獲取點擊的當前行
item = self.Tree_teacher.selection()[0]
currtent_teacher = self.Tree_teacher.item(item, "values") # 根據ID 取出Values
for item in self.teacher_all:
if currtent_teacher[0] == item[0]:
self.teacher_current = item
# 以查看的方法加載
detail = TeacherDetail(self.flag, self.teacher_all, self.teacher_current)
# 接收反饋並刷新表格
self.wait_window(detail)
# 接收 返回的值
get_return_number = detail.userinfo
# 如果值爲1 刷新
if get_return_number == 1:
self.load_teacher_treeview()
def add_teacher(self):
detail = StudentDetail(6)
def delete_teacher(self):
"""
刪除選定的某一行
:return:
"""
pass
if __name__ == '__main__':
maingui = MainGUI()
maingui.mainloop()
3. GUI--studentdetail.py
"""
實現學生明細的GUI
由BaseDetail 派生
"""
"""
查看:只讀 , 修改Title="查看學生明細====", --只有關閉按鈕
觸發: 雙擊 某一行數據
修改:學號,職工號不能修改,修改Title="修改學生明細===="其他可以
觸發操作:選中某一行數據, 然後點擊修改按鈕
添加:所有的輸入框爲空,修改Title="添加學生明細====" 都可以添加
觸發操作:
點擊添加按鈕
"""
from basedetail import *
from tkinter.messagebox import *
from person import *
from studentservices import *
class StudentDetail(BaseDetail):
# def __init__(self, flag, current_student="", list_student_all=""):
# def __init__(self, flag, current_student: list, list_student_all: list):
def __init__(self, flag, list_student_all: list, current_student: list):
super().__init__()
self.flag = flag # 用flag 來標記查看, 添加,修改 三種界面狀態
self.current_student = current_student
self.list_student_all = list_student_all
# 修改Style
self.Style01.configure("TLabel", font=("微軟雅黑", 14), forground="Navy")
self.Style01.configure("TRadiobutton", font=("微軟雅黑", 14, "bold"), foreground="blue", background="lightcyan")
self.Label_Title = Label(self, text="===學生明細===", style="Title.TLabel")
self.Label_Title.place(x=20, y=30)
# 調用
self.student_detail()
# 根據flag 值初始化GUI
self.load_gui_by_flag()
def student_detail(self):
# 添加StudentDetail 內容
# ====學號====
self.Label_sno = Label(self.Pane_detail, text="學號:")
self.Label_sno.place(x=140, y=30)
self.var_sno = StringVar()
self.Entry_sno = Entry(self.Pane_detail, textvariable=self.var_sno, font=("微軟雅黑", 14, "bold"), width=10)
self.Entry_sno.place(x=220, y=28)
# 姓名
self.Label_sname = Label(self.Pane_detail, text="姓名:")
self.Label_sname.place(x=140, y=70)
self.var_name = StringVar()
self.Entry_sname = Entry(self.Pane_detail, textvariable=self.var_name, font=("微軟雅黑", 14, "bold"), width=10)
self.Entry_sname.place(x=220, y=68)
# 性別
self.Label_gender = Label(self.Pane_detail, text="性別:")
self.Label_gender.place(x=140, y=120)
self.var_gender = IntVar()
self.Radio_man = Radiobutton(self.Pane_detail, text="男", variable=self.var_gender, value=1)
self.Radio_man.place(x=220, y=118)
self.Radio_women = Radiobutton(self.Pane_detail, text="女", variable=self.var_gender, value=2)
self.Radio_women.place(x=280, y=118)
# ====出生日期========
self.Label_Birthday = Label(self.Pane_detail, text="出生日期:")
self.Label_Birthday.place(x=102, y=170)
self.var_birthday = StringVar()
self.Entry_Birthday = Entry(self.Pane_detail, textvariable=self.var_birthday, font=("微軟雅黑", 14, "bold"), width=16)
self.Entry_Birthday.place(x=220, y=168)
# ==== 手機號碼========
self.Label_mobile = Label(self.Pane_detail, text="手機號碼:")
self.Label_mobile.place(x=102, y=218)
self.var_mobile = StringVar()
self.Entry_mobile = Entry(self.Pane_detail, textvariable=self.var_mobile, font=("微軟雅黑", 14, "bold"), width=16)
self.Entry_mobile.place(x=220, y=218)
# ====郵箱地址========
self.Label_email = Label(self.Pane_detail, text="郵箱地址:")
self.Label_email.place(x=102, y=268)
self.var_email = StringVar()
self.Entry_email = Entry(self.Pane_detail, textvariable=self.var_email, font=("微軟雅黑", 14, "bold"), width=16)
self.Entry_email.place(x=220, y=268)
# ====所學專業========
self.Label_profession = Label(self.Pane_detail, text="所學專業:")
self.Label_profession.place(x=102, y=318)
self.var_profession = StringVar()
self.Entry_profession = Entry(self.Pane_detail, textvariable=self.var_profession, font=("微軟雅黑", 14, "bold"), width=16)
self.Entry_profession.place(x=220, y=318)
# 入學時間
self.Label_stu_time = Label(self.Pane_detail, text="入學時間:")
self.Label_stu_time.place(x=102, y=368)
self.var_stu_time = StringVar()
self.Entry_stu_time = Entry(self.Pane_detail, textvariable=self.var_stu_time, font=("微軟雅黑", 14, "bold"), width=16)
self.Entry_stu_time.place(x=220, y=368)
def load_gui_by_flag(self):
"""
根據flag 值加載不同的GUI 狀態
:return:
"""
if self.flag == 1:
# 1)查看的窗口狀態
self.Label_Title["text"] = "==查看學生明細=="
# 2) 隱藏保存按鈕
self.Button_save.place_forget()
# 3) 填充數據
self.var_sno.set(self.current_student[0])
self.var_name.set(self.current_student[1])
if "男" in self.current_student[2]:
self.var_gender.set(1)
else:
self.var_gender.set(2)
self.var_birthday.set(self.current_student[3])
self.var_mobile.set(self.current_student[4])
self.var_email.set(self.current_student[5])
self.var_profession.set(self.current_student[6])
self.var_stu_time.set(self.current_student[7])
# 4)禁用Entry
self.Entry_sno["state"] = DISABLED
self.Entry_sname["state"] = DISABLED
self.Radio_man["state"] = DISABLED
self.Radio_women["state"] = DISABLED
self.Entry_Birthday["state"] = DISABLED
self.Entry_mobile["state"] = DISABLED
self.Entry_email["state"] = DISABLED
self.Entry_profession["state"] = DISABLED
self.Entry_stu_time["state"] = DISABLED
elif self.flag == 2:
# 1)修改的窗口明細
self.Label_Title["text"] = "==修改學生明細=="
# 2) 隱藏保存按鈕
# self.Button_save.place_forget()
# 3) 填充數據
self.var_sno.set(self.current_student[0])
self.var_name.set(self.current_student[1])
if "男" in self.current_student[2]:
self.var_gender.set(1)
else:
self.var_gender.set(2)
self.var_birthday.set(self.current_student[3])
self.var_mobile.set(self.current_student[4])
self.var_email.set(self.current_student[5])
self.var_profession.set(self.current_student[6])
self.var_stu_time.set(self.current_student[7])
# 4)禁用Entry
self.Entry_sno["state"] = DISABLED
elif self.flag == 3:
# 添加的窗口明細
self.Label_Title["text"] = "==添加學生明細=="
def commit(self):
# super().commit()
"""
點擊保存按鈕響應的事件
:return:
"""
# showinfo("系統消息", "你點擊了保存按鈕!")
super().commit()
if self.flag == 3: # 添加模塊
# 添加額外功能
# 1) 封裝當前的學生
current_student = self.get_current_student()
current_studentservices = StudentServices(self.list_student_all, current_student)
# 2 校驗學生
return_number = current_studentservices.check()
if return_number == 2:
showinfo("系統消息", "學號不符合要求!")
elif return_number == 3:
showinfo("系統消息", "姓名不符合要求!")
elif return_number == 4:
showinfo("系統消息", "手機號碼不符合要求!")
elif return_number == 5:
showinfo("系統消息", "郵箱地址不符合要求!")
elif return_number == 1:
showinfo("系統消息", "都符合要求!")
# 3) 添加功能
current_studentservices.add()
# 提示添加成功
showinfo("系統消息", "學生信息添加成功")
# 4) 反饋信號給主窗體
self.userinfo = 1
# 5) 關閉
self.destroy()
elif self.flag == 2: # 修改模塊
# 修改功能
# 1) 封裝當前的學生
current_student = self.get_current_student()
current_studentservices = StudentServices(self.list_student_all, current_student)
# 2 校驗學生
return_number = current_studentservices.check()
if return_number == 2:
showinfo("系統消息", "學號不符合要求!")
elif return_number == 3:
showinfo("系統消息", "姓名不符合要求!")
elif return_number == 4:
showinfo("系統消息", "手機號碼不符合要求!")
elif return_number == 5:
showinfo("系統消息", "郵箱地址不符合要求!")
elif return_number == 1:
showinfo("系統消息", "都符合要求!")
# 3) 修改功能
current_studentservices.update()
# 提示添加成功
showinfo("系統消息", "學生信息修改成功")
# 4) 反饋信號給主窗體
self.userinfo = 1
# 5) 關閉
self.destroy()
def get_current_student(self):
"""
把當前填入的信息封裝到student 類
:return:
"""
sno = self.var_sno.get()
name = self.var_name.get()
gender = ""
if self.var_gender.get() == 1:
gender = "男"
elif self.var_gender.get() == 2:
gender = "女"
birthday = self.var_birthday.get()
mobile = self.var_mobile.get()
email = self.var_email.get()
profession = self.var_profession.get()
study_time = self.var_stu_time.get()
# 封裝
current_student = Student(sno, name, gender, birthday, mobile, email, profession, study_time)
# 返回
return current_student
if __name__ == '__main__':
student = StudentDetail(1)
student.mainloop()
4. GUI--teacherdetail.py
"""
實現老師明細的GUI
由BaseDetail 派生
"""
from basedetail import *
class TeacherDetail(BaseDetail):
def __init__(self, flag, list_teacher_all: list, current_teacher: list):
super().__init__()
self.flag = flag
self.list_teacher_all = list_teacher_all
self.current_teacher = current_teacher
# 修改Style
self.Style01.configure("TLabel", font=("微軟雅黑", 12), forground="Navy")
self.Style01.configure("TRadiobutton", font=("微軟雅黑", 12, "bold"), foreground="blue", background="lightcyan")
# 添加StudentDetail 內容
self.Label_Title = Label(self, text="===教師明細===", style="Title.TLabel")
self.Label_Title.place(x=20, y=30)
# 執行
self.teacher_detail()
# 根據flag 值來初始化 GUI界面
self.load_gui_by_flag()
def teacher_detail(self):
# ====職工號====
self.Label_tid = Label(self.Pane_detail, text="職工號:")
self.Label_tid.place(x=120, y=10)
self.var_tid = StringVar()
self.Entry_tid = Entry(self.Pane_detail, textvariable=self.var_tid, font=("微軟雅黑", 12, "bold"), width=10)
self.Entry_tid.place(x=220, y=8)
# 姓名
self.Label_sname = Label(self.Pane_detail, text="姓名:")
self.Label_sname.place(x=140, y=55)
self.var_name = StringVar()
self.Entry_sname = Entry(self.Pane_detail, textvariable=self.var_name, font=("微軟雅黑", 12, "bold"), width=10)
self.Entry_sname.place(x=220, y=53)
# 性別
self.Label_gender = Label(self.Pane_detail, text="性別:")
self.Label_gender.place(x=140, y=100)
self.var_gender = IntVar()
self.Radio_man = Radiobutton(self.Pane_detail, text="男", variable=self.var_gender, value=1)
self.Radio_man.place(x=220, y=98)
self.Radio_women = Radiobutton(self.Pane_detail, text="女", variable=self.var_gender, value=2)
self.Radio_women.place(x=280, y=98)
# ====出生日期========
self.Label_Birthday = Label(self.Pane_detail, text="出生日期:")
self.Label_Birthday.place(x=102, y=145)
self.var_birthday = StringVar()
self.Entry_Birthday = Entry(self.Pane_detail, textvariable=self.var_birthday, font=("微軟雅黑", 12, "bold"), width=16)
self.Entry_Birthday.place(x=220, y=143)
# ==== 手機號碼========
self.Label_mobile = Label(self.Pane_detail, text="手機號碼:")
self.Label_mobile.place(x=102, y=190)
self.var_mobile = StringVar()
self.Entry_mobile = Entry(self.Pane_detail, textvariable=self.var_mobile, font=("微軟雅黑", 12, "bold"), width=16)
self.Entry_mobile.place(x=220, y=188)
# ====郵箱地址========
self.Label_email = Label(self.Pane_detail, text="郵箱地址:")
self.Label_email.place(x=102, y=235)
self.var_email = StringVar()
self.Entry_email = Entry(self.Pane_detail, textvariable=self.var_email, font=("微軟雅黑", 15, "bold"), width=22)
self.Entry_email.place(x=220, y=233)
# ====職稱========
self.Label_title = Label(self.Pane_detail, text="職稱:")
self.Label_title.place(x=130, y=280)
self.var_title = StringVar()
self.Entry_title = Entry(self.Pane_detail, textvariable=self.var_title, font=("微軟雅黑", 15, "bold"), width=16)
self.Entry_title.place(x=220, y=278)
# 畢業學校
self.Label_college = Label(self.Pane_detail, text="畢業學校:")
self.Label_college.place(x=102, y=325)
self.var_college = StringVar()
self.Entry_college = Entry(self.Pane_detail, textvariable=self.var_college, font=("微軟雅黑", 15, "bold"), width=16)
self.Entry_college.place(x=220, y=323)
# 入職時間
self.Label_work_time = Label(self.Pane_detail, text="入職時間:")
self.Label_work_time.place(x=102, y=370)
self.var_work_time = StringVar()
self.Entry_work_time = Entry(self.Pane_detail, textvariable=self.var_work_time, font=("微軟雅黑", 15, "bold"), width=16)
self.Entry_work_time.place(x=220, y=368)
def load_gui_by_flag(self):
"""
根據
:return:
"""
if self.flag == 4:
# 1)查看的窗口狀態
self.Label_Title["text"] = "==查看教師明細=="
# 2) 隱藏保存按鈕
self.Button_save.place_forget()
# 3) 填充數據
self.var_tid.set(self.current_teacher[0])
self.var_name.set(self.current_teacher[1])
if "男" in self.current_teacher[2]:
self.var_gender.set(1)
else:
self.var_gender.set(2)
self.var_birthday.set(self.current_teacher[3])
self.var_mobile.set(self.current_teacher[4])
self.var_email.set(self.current_teacher[5])
self.var_title.set(self.current_teacher[6])
self.var_college.set(self.current_teacher[7])
self.var_work_time.set(self.current_teacher[8])
# 4)禁用Entry
self.Entry_tid["state"] = DISABLED
self.Entry_sname["state"] = DISABLED
self.Radio_man["state"] = DISABLED
self.Radio_women["state"] = DISABLED
self.Entry_Birthday["state"] = DISABLED
self.Entry_mobile["state"] = DISABLED
self.Entry_email["state"] = DISABLED
self.Entry_title["state"] = DISABLED
self.Entry_college["state"] = DISABLED
self.Entry_work_time["state"] = DISABLED
elif self.flag == 5:
# 1) 修改的窗口明細
self.Label_Title["text"] = "==修改教師明細=="
# 2) 隱藏保存按鈕
# self.Button_save.place_forget()
# 3) 填充數據
self.var_tid.set(self.current_teacher[0])
self.var_name.set(self.current_teacher[1])
if "男" in self.current_teacher[2]:
self.var_gender.set(1)
else:
self.var_gender.set(2)
self.var_birthday.set(self.current_teacher[3])
self.var_mobile.set(self.current_teacher[4])
self.var_email.set(self.current_teacher[5])
self.var_title.set(self.current_teacher[6])
self.var_college.set(self.current_teacher[7])
self.var_work_time.set(self.current_teacher[8])
# 4)禁用Entry
self.Entry_tid["state"] = DISABLED
elif self.flag == 6:
# 添加的窗口明細
self.Label_Title["text"] = "==添加教師明細=="
if __name__ == '__main__':
teacher = TeacherDetail()
teacher.mainloop()
5. Services--check.py
import re
class Check:
def check_sno(self, sno):
pattern = re.compile("^95\d{4}$")
match_result = pattern.match(sno)
if match_result is None:
return False
else:
return True
def check_name(self, name:str):
# 校驗是否小於10 並大於2
if len(name) <=10 and len(name) >=2:
for item in name:
if item < "\u4E00" and item > "\u9FA5":
return False
else:
return True
else:
return False
def check_gender(self, gender:str):
if gender.strip() in ["男", "女"]:
return True
else:
return False
def check_mobile(self, mobile):
pattern = re.compile(r"^1[3578]\d{9}$")
match_result = pattern.match(mobile)
if match_result is None:
return False
else:
return True
def check_email(self, email):
pattern = re.compile(r"\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}")
match_result = pattern.match(email)
if match_result is None:
return False
else:
return True
if __name__ == '__main__':
sno = input("請輸入學號:")
check = Check()
print(check.check_sno(sno))
6. Services--fileoperator.py
"""
主要實現讀取文件內容,保存到文件
"""
import os
class File:
def __init__(self):
# 記錄學生信息的文件路徑
self.student_path = "../file/student.txt"
# 記錄教師信息的文件路徑
self.teacher_path = "../file/teacher.txt"
# 定義存儲所有學生list
self.list_student_all = []
# 定義存儲所有教師list
self.list_teacher_all = []
self.read_from_file()
def read_from_file(self):
# 讀取學生信息
try:
with open(self.student_path, mode="r") as fd_student:
current_line = fd_student.readline()
while current_line:
# 通過空格進行分割
student_list = current_line.split(",")
# 添加 學生姓名
self.list_student_all.append(student_list)
# 將一行信息添加
# self.list_student_all.append(temp_list)
# 讀取下一行
current_line = fd_student.readline()
# print(self.list_student_all)
except Exception as e:
print(e)
# ==========讀取教師信息=================
try:
with open(self.teacher_path, mode="r", encoding="utf-8") as fd_teacher:
current_line = fd_teacher.readline()
while current_line:
# 通過空格進行分割
teacher_list = current_line.split(",")
# 添加 學生姓名
self.list_teacher_all.append(teacher_list)
# 將一行信息添加
# self.list_student_all.append(temp_list)
# 讀取下一行
current_line = fd_teacher.readline()
# print(self.list_student_all)
except Exception as e:
print(e)
def write_to_file(self):
# 寫入學生信息
try:
with open(self.student_path, mode="w") as fd_student:
fd_student.write("")
with open(self.student_path, mode="a") as fd_student:
for item in self.list_student_all:
temp = ",".join(item)
temp = temp.replace("\n", "") + "\n"
fd_student.write(temp)
except Exception as e:
print(e)
# 寫入教師信息
try:
with open(self.teacher_path, mode="w") as fd_teacher:
fd_teacher.write("")
with open(self.teacher_path, mode="a") as fd_teacher:
for item in self.list_teacher_all:
temp = ",".join(item)
temp = temp.replace("\n", "") + "\n"
fd_teacher.write(temp)
except Exception as e:
print(e)
if __name__ == '__main__':
file = File()
print(file.list_student_all)
print("=======================================")
print(file.list_teacher_all)
7. Services--person.py
"""
實體類:
Person: name, gender, birthday, mobile, email
Student(Person):sno, profession, stud_time
Teacher(Person):tid, title, college, work_time
"""
class Person:
def __init__(self, name, gender,birthday, mobile, email):
self.name = name
self.gender = gender
self.birthday = birthday
self.mobile = mobile
self.email = email
# 派生類
class Student(Person):
def __init__(self, sno, name, gender, birthday, mobile, email, profession, study_time):
super().__init__(name, gender, birthday, mobile, email) # 初始化父類
self.sno = sno
self.profession = profession
self.study_time = study_time
class Teacher(Person):
def __init__(self, tid, name, gender, birthday, mobile, email, title, college, work_time):
super().__init__(name, gender, birthday, mobile, email)
self.tid = tid
self.title = title
self.college = college
self.work_time = work_time
8.Services--services.py
"""
抽象類:
抽象方法:Add, update, delete, check
"""
from abc import *
class Services(metaclass=ABCMeta):
@abstractmethod
def add(self): pass
@abstractmethod
def update(self): pass
@abstractmethod
def delete(self): pass
@abstractmethod
def check(self): pass
9. Services---studentservices.py
from check import *
from services import *
from person import *
class StudentServices(Services, Check):
def __init__(self, list_all: list, student_current: Student):
Services.__init__(self)
Check.__init__(self)
self.list_all = list_all
self.student_current = student_current # 一行學生信息
def check(self):
"""
校驗輸入是否有效
:return:
"""
# return_number = 0
if not self.check_sno(self.student_current.sno):
return_number = 2
elif not self.check_name(self.student_current.name):
return_number = 3
elif self.check_mobile(self.student_current.mobile) is not True:
return_number = 4
elif self.check_email(self.student_current.email) is not True:
return_number = 5
else:
return_number = 1
# 返回
return return_number
def add(self):
"""
添加
:return:
"""
current_student_list = []
current_student_list.append(self.student_current.sno)
current_student_list.append(self.student_current.name)
current_student_list.append(self.student_current.gender)
current_student_list.append(self.student_current.birthday)
current_student_list.append(self.student_current.mobile)
current_student_list.append(self.student_current.email)
current_student_list.append(self.student_current.profession)
current_student_list.append(self.student_current.study_time)
# 當前學生添加到集合中
self.list_all.append(current_student_list)
def update(self):
# 通過循環遍歷list, 修改信息
for index in range(len(self.list_all)):
if self.list_all[index][0] == self.student_current.sno:
self.list_all[index][1] = self.student_current.name
self.list_all[index][2] = self.student_current.gender
self.list_all[index][3] = self.student_current.birthday
self.list_all[index][4] = self.student_current.mobile
self.list_all[index][5] = self.student_current.email
self.list_all[index][6] = self.student_current.profession
self.list_all[index][7] = self.student_current.study_time
# 將修改的信息添加到集合中
# return self.list_all
def delete(self):
# 通過循環遍歷, 刪除信息
for index in range(len(self.list_all)):
if self.list_all[index][0] == self.student_current.sno:
self.list_all.pop(index)
"""
實現學生操作的功能,繼承Services 和Check
"""