import tkinter as tk
from tkinter import messagebox
import random
import time
import threading

class MathQuizApp:
    def __init__(self, root):
        self.root = root
        self.root.title("037. 数学题练习器")
        self.root.geometry("580x560")
        self.root.resizable(False, False)

        self.score = 0
        self.total = 0
        self.quiz_running = False
        self.current_answer = 0

        self.build_ui()
        self.show_table()

    # ========== UI 构建 ==========
    def build_ui(self):
        # 标题
        tk.Label(
            self.root, text="✏️ 数学题练习器",
            font=("微软雅黑", 18, "bold")
        ).pack(pady=10)

        # ===== 模式选择 =====
        mode_frame = tk.LabelFrame(self.root, text="练习模式", font=("微软雅黑", 10))
        mode_frame.pack(padx=20, pady=5, fill=tk.X)

        self.mode = tk.StringVar(value="加")
        for text, val in [
            ("加法", "加"),
            ("减法", "减"),
            ("乘法", "乘"),
            ("除法", "除"),
            ("混合", "混合")
        ]:
            tk.Radiobutton(
                mode_frame, text=text, variable=self.mode,
                value=val, font=("微软雅黑", 9)
            ).pack(side=tk.LEFT, padx=8)

        # ===== 参数设置 =====
        diff_frame = tk.Frame(self.root)
        diff_frame.pack(pady=5)

        tk.Label(diff_frame, text="数值范围：1 ~ ").pack(side=tk.LEFT)

        # ✅ Spinbox 安全写法（修复第 70 行问题）
        self.range_spin = tk.Spinbox(diff_frame, width=5)
        self.range_spin.config(from_=10, to=999)
        self.range_spin.delete(0, tk.END)
        self.range_spin.insert(0, "100")

        tk.Label(diff_frame, text="    限时（秒）：").pack(side=tk.LEFT)

        self.time_spin = tk.Spinbox(diff_frame, width=5)
        self.time_spin.config(from_=10, to=300)
        self.time_spin.delete(0, tk.END)
        self.time_spin.insert(0, "60")

        # ===== 题目区 =====
        q_frame = tk.LabelFrame(self.root, text="题目", font=("微软雅黑", 10))
        q_frame.pack(padx=20, pady=8, fill=tk.X)

        self.question_label = tk.Label(
            q_frame, text="点击“开始练习”按钮出题",
            font=("Consolas", 20, "bold"), fg="#1565C0"
        )
        self.question_label.pack(pady=10)

        answer_frame = tk.Frame(q_frame)
        answer_frame.pack(pady=5)

        tk.Label(answer_frame, text="你的答案：").pack(side=tk.LEFT)
        self.answer_entry = tk.Entry(answer_frame, width=12, font=("Consolas", 14))
        self.answer_entry.pack(side=tk.LEFT, padx=5)
        self.answer_entry.bind("<Return>", lambda e: self.check_answer())

        tk.Button(
            answer_frame, text="提交", bg="#4CAF50", fg="white",
            font=("微软雅黑", 10, "bold"),
            command=self.check_answer
        ).pack(side=tk.LEFT, padx=8)

        # ===== 反馈 =====
        self.feedback_label = tk.Label(self.root, text="", font=("微软雅黑", 12))
        self.feedback_label.pack(pady=3)

        # ===== 统计 =====
        stat_frame = tk.LabelFrame(self.root, text="统计", font=("微软雅黑", 10))
        stat_frame.pack(padx=20, pady=5, fill=tk.X)

        self.stat_label = tk.Label(
            stat_frame, text="正确：0  错误：0  正确率：--%",
            font=("Consolas", 10)
        )
        self.stat_label.pack(anchor="w", padx=10, pady=3)

        self.timer_label = tk.Label(
            stat_frame, text="用时：-- / -- 秒",
            font=("Consolas", 10)
        )
        self.timer_label.pack(anchor="w", padx=10, pady=2)

        # ===== 按钮区 =====
        btn_frame = tk.Frame(self.root)
        btn_frame.pack(pady=8)

        self.start_btn = tk.Button(
            btn_frame, text="▶ 开始练习",
            width=14, height=2,
            bg="#4CAF50", fg="white",
            font=("微软雅黑", 11, "bold"),
            command=self.start_quiz
        )
        self.start_btn.pack(side=tk.LEFT, padx=8)

        tk.Button(
            btn_frame, text="📋 乘法口诀表",
            width=14, height=2,
            bg="#FF9800", fg="white",
            font=("微软雅黑", 11),
            command=self.toggle_table
        ).pack(side=tk.LEFT, padx=8)

        tk.Button(
            btn_frame, text="重置成绩",
            width=10, height=2,
            bg="#f44336", fg="white",
            font=("微软雅黑", 10),
            command=self.reset_score
        ).pack(side=tk.LEFT, padx=8)

        # ===== 乘法表区 =====
        self.table_frame = tk.LabelFrame(self.root, text="乘法口诀表", font=("微软雅黑", 10))

    # ========== 题目逻辑 ==========
    def generate_question(self):
        rng = int(self.range_spin.get())
        mode = self.mode.get()

        if mode == "混合":
            mode = random.choice(["加", "减", "乘", "除"])

        if mode == "加":
            a = random.randint(1, rng)
            b = random.randint(1, rng)
            self.current_answer = a + b
            self.question_label.config(text=f"{a}  +  {b}  =  ?")

        elif mode == "减":
            a = random.randint(1, rng)
            b = random.randint(1, a)
            self.current_answer = a - b
            self.question_label.config(text=f"{a}  −  {b}  =  ?")

        elif mode == "乘":
            a = random.randint(1, min(12, rng))
            b = random.randint(1, min(12, rng))
            self.current_answer = a * b
            self.question_label.config(text=f"{a}  ×  {b}  =  ?")

        elif mode == "除":
            b = random.randint(1, min(12, rng))
            self.current_answer = random.randint(1, min(12, rng))
            a = self.current_answer * b
            self.question_label.config(text=f"{a}  ÷  {b}  =  ?")

        self.answer_entry.delete(0, tk.END)
        self.feedback_label.config(text="")
        self.answer_entry.focus()

    def check_answer(self):
        if not self.quiz_running:
            return
        try:
            user_ans = int(self.answer_entry.get().strip())
        except ValueError:
            self.feedback_label.config(text="⚠️ 请输入数字！", fg="#FF9800")
            return

        self.total += 1
        if user_ans == self.current_answer:
            self.score += 1
            self.feedback_label.config(text="✅ 回答正确！", fg="#4CAF50")
        else:
            self.feedback_label.config(
                text=f"❌ 答错了，正确答案是：{self.current_answer}",
                fg="#f44336"
            )

        self.update_stat()
        self.root.after(800, self.generate_question)

    def update_stat(self):
        rate = (self.score / self.total * 100) if self.total else 0
        self.stat_label.config(
            text=f"正确：{self.score}  错误：{self.total - self.score}  正确率：{rate:.1f}%"
        )

    # ========== 计时器 ==========
    def start_quiz(self):
        self.score = 0
        self.total = 0
        self.quiz_running = True
        self.start_btn.config(state="disabled")

        self.generate_question()
        self.update_stat()

        self.time_limit = int(self.time_spin.get())
        self.start_time = time.time()

        threading.Thread(target=self.run_timer, daemon=True).start()

    def run_timer(self):
        while self.quiz_running:
            elapsed = int(time.time() - self.start_time)
            remaining = self.time_limit - elapsed
            self.root.after(
                lambda e=elapsed, r=remaining:
                self.timer_label.config(text=f"用时：{e} / {self.time_limit} 秒")
            )
            if remaining <= 0:
                break
            time.sleep(1)

        if self.quiz_running:
            self.root.after(self.time_up)

    def time_up(self):
        self.quiz_running = False
        self.start_btn.config(state="normal")
        rate = (self.score / self.total * 100) if self.total else 0
        messagebox.showinfo(
            "练习结束",
            f"时间到！\n\n共答题：{self.total}\n正确率：{rate:.1f}%"
        )

    def reset_score(self):
        if messagebox.askyesno("确认", "重置成绩统计？"):
            self.score = 0
            self.total = 0
            self.quiz_running = False
            self.question_label.config(text="点击“开始练习”按钮出题")
            self.feedback_label.config(text="")
            self.update_stat()
            self.timer_label.config(text="用时：-- / -- 秒")
            self.start_btn.config(state="normal")

    # ========== 乘法口诀表（第 295 行已修复） ==========
    def show_table(self):
        frame = self.table_frame
        frame.pack(padx=20, pady=5, fill=tk.BOTH, expand=True)

        for w in frame.winfo_children():
            w.destroy()

        # 表头：×
        tk.Label(
            frame, text="×", width=4,
            font=("Consolas", 9, "bold"),
            bg="#E3F2FD"
        ).grid(row=0, column=0, padx=1, pady=1)

        # 表头：1~9
        for j in range(1, 10):
            tk.Label(
                frame, text=str(j), width=4,
                font=("Consolas", 9, "bold"),
                bg="#E3F2FD"
            ).grid(row=0, column=j, padx=1, pady=1)

        # 表格内容
        for i in range(1, 10):
            tk.Label(
                frame, text=str(i), width=4,
                font=("Consolas", 9, "bold"),
                bg="#E3F2FD"
            ).grid(row=i, column=0, padx=1, pady=1)

            for j in range(1, 10):
                bg = "#F9FBE7" if (i + j) % 2 == 0 else "#FFFFFF"
                tk.Label(
                    frame, text=str(i * j), width=4,
                    font=("Consolas", 9),
                    bg=bg
                ).grid(row=i, column=j, padx=1, pady=1)

        tk.Button(
            frame, text="关闭口诀表",
            command=lambda: frame.pack_forget()
        ).grid(row=10, column=0, columnspan=10, pady=5)

    def toggle_table(self):
        if self.table_frame.winfo_ismapped():
            self.table_frame.pack_forget()
        else:
            self.show_table()


if __name__ == "__main__":
    root = tk.Tk()
    MathQuizApp(root)
    root.mainloop()