# 基于Python自带tkinter制作可视化课程表GUI，无需额外安装第三方库
import tkinter as tk
from tkinter import ttk, messagebox

class ClassScheduleApp:
    def __init__(self, root_window):
        self.root = root_window
        self.root.title("个人课程表")
        # 修复：去掉逗号空格，格式为 宽度x高度
        self.root.geometry("920x620")

        # 星期、课时基础配置
        self.week_list = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
        self.time_period = ["第1节", "第2节", "第3节", "第4节", "第5节", "第6节", "第7节", "第8节"]
        # 二维数组存储课程数据
        self.course_table = [["" for _ in range(7)] for _ in range(8)]
        # 记录当前鼠标选中的单元格
        self.select_r = -1
        self.select_c = -1

        self.build_ui()

    def build_ui(self):
        # 顶部操作工具栏
        top_bar = tk.Frame(self.root)
        top_bar.pack(fill="x", padx=12, pady=6)

        tk.Label(top_bar, text="课时：").pack(side="left")
        self.combo_period = ttk.Combobox(top_bar, values=self.time_period, width=9)
        self.combo_period.current(0)
        self.combo_period.pack(side="left", padx=4)

        tk.Label(top_bar, text="星期：").pack(side="left", padx=6)
        self.combo_week = ttk.Combobox(top_bar, values=self.week_list, width=9)
        self.combo_week.current(0)
        self.combo_week.pack(side="left", padx=4)

        tk.Label(top_bar, text="课程名：").pack(side="left", padx=6)
        self.input_course = tk.Entry(top_bar, width=18)
        self.input_course.pack(side="left")

        tk.Button(top_bar, text="填入课程", command=self.add_course).pack(side="left", padx=6)
        tk.Button(top_bar, text="清空选中格子", command=self.clear_one).pack(side="left", padx=4)
        tk.Button(top_bar, text="一键清空全表", command=self.clear_all_table).pack(side="left", padx=4)

        # 课程表格主体区域
        table_area = tk.Frame(self.root)
        table_area.pack(expand=True, fill="both", padx=12, pady=10)

        # 绘制表头
        for col, day_name in enumerate(["课时"] + self.week_list):
            head_label = tk.Label(
                table_area, text=day_name, bg="#2980b9", fg="white",
                width=11, height=2, relief="solid", font=("微软雅黑", 10)
            )
            head_label.grid(row=0, column=col, sticky="nsew")

        # 生成表格单元格
        self.cell_widgets = []
        for row_idx, period_name in enumerate(self.time_period, start=1):
            row_item = []
            # 左侧课时固定列
            tk.Label(
                table_area, text=period_name, bg="#aed6f1", width=11, height=3,
                relief="solid", font=("微软雅黑", 9)
            ).grid(row=row_idx, column=0, sticky="nsew")

            # 每一个课程单元格
            for col_idx in range(1, 8):
                cell_lab = tk.Label(
                    table_area, text="", bg="white", width=11, height=3,
                    relief="solid", wraplength=90, font=("微软雅黑", 9)
                )
                cell_lab.grid(row=row_idx, column=col_idx, sticky="nsew")
                # 鼠标点击选中单元格
                cell_lab.bind("<Button-1>", lambda e, r=row_idx-1, c=col_idx-1: self.click_cell(r, c))
                row_item.append(cell_lab)
            self.cell_widgets.append(row_item)

        # 行列自适应铺满窗口
        for i in range(9):
            table_area.grid_columnconfigure(i, weight=1)
        for i in range(9):
            table_area.grid_rowconfigure(i, weight=1)

    # 鼠标点击选中格子
    def click_cell(self, r, c):
        # 取消上一个选中高亮
        if 0 <= self.select_r < 8 and 0 <= self.select_c < 7:
            self.cell_widgets[self.select_r][self.select_c].config(bg="white")
        self.select_r, self.select_c = r, c
        self.cell_widgets[r][c].config(bg="#ffeaa7")

    # 添加/修改课程
    def add_course(self):
        p_val = self.combo_period.get()
        w_val = self.combo_week.get()
        course_name = self.input_course.get().strip()

        if not course_name:
            messagebox.showwarning("提示", "请输入课程名称！")
            return

        r = self.time_period.index(p_val)
        c = self.week_list.index(w_val)
        self.course_table[r][c] = course_name
        self.cell_widgets[r][c].config(text=course_name, bg="white")
        self.input_course.delete(0, tk.END)
        messagebox.showinfo("完成", f"{w_val} {p_val} 已设置：{course_name}")

    # 清空单个选中格子
    def clear_one(self):
        if self.select_r == -1 or self.select_c == -1:
            messagebox.showinfo("提示", "先用鼠标点击表格里要清空的格子！")
            return
        self.course_table[self.select_r][self.select_c] = ""
        self.cell_widgets[self.select_r][self.select_c].config(text="", bg="white")
        self.select_r = -1
        self.select_c = -1

    # 整张表全部清空
    def clear_all_table(self):
        if messagebox.askyesno("确认", "确定清空整张课程表所有数据？"):
            self.course_table = [["" for _ in range(7)] for _ in range(8)]
            for row in self.cell_widgets:
                for lab in row:
                    lab.config(text="", bg="white")
            self.select_r = -1
            self.select_c = -1

if __name__ == "__main__":
    main_window = tk.Tk()
    app = ClassScheduleApp(main_window)
    main_window.mainloop()