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

class MathTrainer:
    def __init__(self, root):
        self.root = root
        self.root.title("限时口算训练器")
        self.root.geometry("520x420")
        self.root.resizable(False, False)

        # 训练参数
        self.time_limit = tk.IntVar(value=60)    # 限时秒数
        self.max_num = tk.IntVar(value=20)       # 数字最大范围
        self.total_count = tk.IntVar(value=10)   # 总题数

        # 训练状态变量
        self.running = False
        self.start_time = 0
        self.remain_time = 0
        self.current_q = None
        self.q_index = 0
        self.correct = 0
        self.wrong_list = []
        self.all_questions = []

        self.create_widgets()

    def create_widgets(self):
        # 设置面板
        frame_setting = tk.LabelFrame(self.root, text="训练设置", padx=10, pady=8)
        frame_setting.pack(fill="x", padx=12, pady=6)

        tk.Label(frame_setting, text="限时(秒)：").grid(row=0, column=0, sticky="w")
        tk.Entry(frame_setting, textvariable=self.time_limit, width=6).grid(row=0, column=1, padx=5)

        tk.Label(frame_setting, text="数字上限：").grid(row=0, column=2, sticky="w", padx=10)
        tk.Entry(frame_setting, textvariable=self.max_num, width=6).grid(row=0, column=3)

        tk.Label(frame_setting, text="总题数：").grid(row=0, column=4, sticky="w", padx=10)
        tk.Entry(frame_setting, textvariable=self.total_count, width=6).grid(row=0, column=5)

        # 倒计时显示
        self.label_time = tk.Label(self.root, text="剩余时间：-- 秒", font=("黑体", 14), fg="red")
        self.label_time.pack(pady=8)

        # 题目显示
        self.label_question = tk.Label(self.root, text="点击开始训练", font=("黑体", 30))
        self.label_question.pack(pady=12)

        # 答案输入区
        frame_ans = tk.Frame(self.root)
        frame_ans.pack()
        tk.Label(frame_ans, text="你的答案：", font=("黑体", 14)).grid(row=0, column=0)
        self.entry_ans = tk.Entry(frame_ans, font=("黑体", 16), width=10, justify="center")
        self.entry_ans.grid(row=0, column=1, padx=10)
        self.entry_ans.bind("<Return>", self.submit_answer)  # 回车提交

        # 按钮区
        frame_btn = tk.Frame(self.root)
        frame_btn.pack(pady=15)
        self.btn_start = tk.Button(frame_btn, text="开始训练", command=self.start_train, width=10, height=2)
        self.btn_start.grid(row=0, column=0, padx=8)
        self.btn_submit = tk.Button(frame_btn, text="提交答案", command=self.submit_answer, width=10, height=2, state="disabled")
        self.btn_submit.grid(row=0, column=1, padx=8)
        self.btn_reset = tk.Button(frame_btn, text="重置", command=self.reset_all, width=10, height=2)
        self.btn_reset.grid(row=0, column=2, padx=8)

        # 进度显示
        self.label_progress = tk.Label(self.root, text="进度：0/0", font=("黑体",12))
        self.label_progress.pack()

    def random_question(self):
        """生成随机加减乘题目"""
        max_n = self.max_num.get()
        a = random.randint(1, max_n)
        b = random.randint(1, max_n)
        op = random.choice(["+", "-", "*"])
        if op == "-":
            # 减法保证结果非负
            if a < b:
                a, b = b, a
            res = a - b
        elif op == "+":
            res = a + b
        else:
            res = a * b
        return f"{a} {op} {b} = ?", res

    def start_train(self):
        # 参数校验
        t = self.time_limit.get()
        m = self.max_num.get()
        cnt = self.total_count.get()
        if t <= 0 or m <= 0 or cnt <=0:
            messagebox.showerror("错误", "所有数值必须大于0！")
            return
        if self.running:
            return

        # 初始化训练数据
        self.running = True
        self.q_index = 0
        self.correct = 0
        self.wrong_list.clear()
        self.all_questions.clear()
        self.start_time = time.time()
        self.remain_time = t

        # 生成全部题目
        for _ in range(cnt):
            q_str, ans = self.random_question()
            self.all_questions.append((q_str, ans))

        self.btn_start.config(state="disabled")
        self.btn_submit.config(state="normal")
        self.entry_ans.delete(0, tk.END)
        self.entry_ans.focus()

        self.show_next_question()
        self.countdown_loop()

    def countdown_loop(self):
        if not self.running:
            return
        used = time.time() - self.start_time
        left = self.time_limit.get() - int(used)
        self.remain_time = left
        self.label_time.config(text=f"剩余时间：{left} 秒")
        if left <= 0:
            self.time_up()
            return
        self.root.after(1000, self.countdown_loop)

    def show_next_question(self):
        total = self.total_count.get()
        if self.q_index >= total:
            self.finish_train()
            return
        q_text, _ = self.all_questions[self.q_index]
        self.label_question.config(text=q_text)
        self.label_progress.config(text=f"进度：{self.q_index}/{total}")
        self.entry_ans.delete(0, tk.END)

    def submit_answer(self, event=None):
        if not self.running:
            return
        input_text = self.entry_ans.get().strip()
        if not input_text.isdigit():
            messagebox.showwarning("提示", "请输入数字答案！")
            return
        user_ans = int(input_text)
        q_text, std_ans = self.all_questions[self.q_index]

        if user_ans == std_ans:
            self.correct +=1
        else:
            self.wrong_list.append(f"{q_text} 正确答案：{std_ans}，你的答案：{user_ans}")

        self.q_index +=1
        self.show_next_question()

    def time_up(self):
        self.running = False
        messagebox.showinfo("时间到！", "答题时间已用完，自动结束训练")
        self.finish_train()

    def finish_train(self):
        self.running = False
        total = self.total_count.get()
        acc = self.correct / total * 100 if total >0 else 0
        msg = f"训练完成！\n总题数：{total}\n答对：{self.correct}\n正确率：{acc:.1f}%\n\n"
        if self.wrong_list:
            msg += "错题列表：\n" + "\n".join(self.wrong_list)
        else:
            msg += "全部答对，太棒了！"
        messagebox.showinfo("成绩报告", msg)
        self.reset_all()

    def reset_all(self):
        self.running = False
        self.label_time.config(text="剩余时间：-- 秒")
        self.label_question.config(text="点击开始训练")
        self.label_progress.config(text="进度：0/0")
        self.entry_ans.delete(0, tk.END)
        self.btn_start.config(state="normal")
        self.btn_submit.config(state="disabled")

if __name__ == "__main__":
    window = tk.Tk()
    app = MathTrainer(window)
    window.mainloop()