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("520x380")

        # 训练参数
        self.total_questions = tk.IntVar(value=10)    # 总题数
        self.time_limit = tk.IntVar(value=60)         # 限时秒数
        self.current_q = 0
        self.score = 0
        self.error_list = []
        self.start_time = 0
        self.remain_time = 0
        self.timer_running = False

        # 当前题目数据
        self.num1 = 0
        self.num2 = 0
        self.op = ""
        self.answer = 0

        self.build_ui()

    def build_ui(self):
        # 设置区域
        frame_setting = tk.Frame(self.root, pady=8)
        frame_setting.pack()

        tk.Label(frame_setting, text="题目数量：").grid(row=0, column=0, padx=5)
        tk.Entry(frame_setting, textvariable=self.total_questions, width=6).grid(row=0, column=1, padx=5)

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

        self.btn_start = tk.Button(frame_setting, text="开始训练", command=self.start_train, bg="#4285f4", fg="white")
        self.btn_start.grid(row=0, column=4, padx=10)

        # 题目显示区
        self.label_question = tk.Label(self.root, text="准备开始", font=("Arial", 30), pady=20)
        self.label_question.pack()

        # 答题输入区
        frame_answer = tk.Frame(self.root)
        frame_answer.pack()
        tk.Label(frame_answer, text="你的答案：", font=("Arial",16)).grid(row=0, column=0)
        self.entry_ans = tk.Entry(frame_answer, font=("Arial",18), width=10)
        self.entry_ans.grid(row=0, column=1, padx=10)
        self.entry_ans.bind("<Return>", self.submit_answer)
        self.btn_submit = tk.Button(frame_answer, text="提交", command=self.submit_answer)
        self.btn_submit.grid(row=0, column=2)

        # 状态信息
        self.label_info = tk.Label(self.root, text="题目：0/0 | 剩余时间：--", font=("Arial",14), pady=15)
        self.label_info.pack()

    def generate_question(self):
        # 生成100以内加减口算，修改这里可以开启乘除
        self.num1 = random.randint(1, 99)
        self.num2 = random.randint(1, 99)
        if random.random() > 0.5:
            self.op = "+"
            self.answer = self.num1 + self.num2
        else:
            # 减法保证结果不为负数
            if self.num1 < self.num2:
                self.num1, self.num2 = self.num2, self.num1
            self.op = "-"
            self.answer = self.num1 - self.num2
        self.label_question.config(text=f"{self.num1} {self.op} {self.num2} = ?")

    def start_train(self):
        try:
            q_num = self.total_questions.get()
            t_limit = self.time_limit.get()
            if q_num <= 0 or t_limit <=0:
                messagebox.showwarning("警告", "题目数和时间必须大于0！")
                return
        except:
            messagebox.showerror("错误", "请输入合法数字")
            return

        self.current_q = 0
        self.score = 0
        self.error_list.clear()
        self.remain_time = self.time_limit.get()
        self.start_time = time.time()
        self.timer_running = True

        self.generate_question()
        self.entry_ans.delete(0, tk.END)
        self.entry_ans.focus()
        self.update_timer()

    def update_timer(self):
        if not self.timer_running:
            return
        used = time.time() - self.start_time
        self.remain_time = self.time_limit.get() - int(used)

        if self.remain_time <= 0:
            self.timer_running = False
            self.remain_time = 0
            self.show_result()
            return

        self.label_info.config(text=f"题目：{self.current_q}/{self.total_questions.get()} | 剩余时间：{self.remain_time}秒")
        self.root.after(1000, self.update_timer)

    def submit_answer(self, event=None):
        if not self.timer_running:
            return
        try:
            user_ans = int(self.entry_ans.get())
        except ValueError:
            messagebox.showinfo("提示", "请输入数字答案！")
            return

        self.current_q += 1
        if user_ans == self.answer:
            self.score += 1
        else:
            self.error_list.append(f"{self.num1}{self.op}{self.num2}={self.answer} (你的答案:{user_ans})")

        # 判断是否完成所有题目
        if self.current_q >= self.total_questions.get():
            self.timer_running = False
            self.show_result()
            return

        # 下一题
        self.generate_question()
        self.entry_ans.delete(0, tk.END)
        self.entry_ans.focus()

    def show_result(self):
        total = self.total_questions.get()
        correct = self.score
        accuracy = correct / total * 100
        msg = f"====训练结束====\n总题数：{total}\n答对：{correct}\n正确率：{accuracy:.1f}%\n\n"
        if self.error_list:
            msg += "错题汇总：\n"
            for item in self.error_list:
                msg += item + "\n"
        else:
            msg += "全部答对，太棒了！🎉"
        messagebox.showinfo("成绩报告", msg)
        self.label_question.config(text="训练结束，重新设置参数开始！")
        self.label_info.config(text="题目：0/0 | 剩余时间：--")

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