學生和教師信息管理系統

這是一個比較綜合性的程序,要求能運用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

"""

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章