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

class MathPractice:
    def __init__(self, root):
        # 主窗口配置
        self.root = root
        self.root.title("数学小能手 - 四则/乘法口诀练习器")
        self.root.geometry("550x420")
        self.root.resizable(False, False)

        # 全局变量
        self.mode = "multi"  # multi:乘法口诀  calc:四则运算
        self.score = 0       # 得分
        self.count = 0       # 答题总数
        self.wrong_count = 0 # 错题数
        self.start_time = 0  # 开始时间
        self.question = ""   # 当前题目
        self.answer = 0      # 正确答案

        # 创建UI组件
        self.create_widgets()
        # 初始化第一道题
        self.generate_question()

    def create_widgets(self):
        # 顶部模式选择框架
        frame_top = tk.Frame(self.root, padx=10, pady=10)
        frame_top.pack(fill=tk.X)

        self.var_mode = tk.StringVar(value="multi")
        tk.Radiobutton(frame_top, text="乘法口诀练习", variable=self.var_mode, value="multi", 
                       command=self.switch_mode, font=("微软雅黑", 11)).pack(side=tk.LEFT, padx=20)
        tk.Radiobutton(frame_top, text="四则运算练习", variable=self.var_mode, value="calc", 
                       command=self.switch_mode, font=("微软雅黑", 11)).pack(side=tk.LEFT, padx=20)

        # 统计信息展示
        frame_stat = tk.Frame(self.root, padx=10)
        frame_stat.pack(fill=tk.X)
        self.label_score = tk.Label(frame_stat, text=f"得分：0 | 答题：0 | 错题：0", font=("微软雅黑", 12))
        self.label_score.pack()

        # 题目显示区域
        frame_q = tk.Frame(self.root, pady=30)
        frame_q.pack()
        self.label_question = tk.Label(frame_q, text="准备开始", font=("微软雅黑", 36, "bold"))
        self.label_question.pack()

        # 答案输入框
        frame_input = tk.Frame(self.root)
        frame_input.pack(pady=10)
        tk.Label(frame_input, text="你的答案：", font=("微软雅黑", 14)).pack(side=tk.LEFT, padx=5)
        self.entry_ans = tk.Entry(frame_input, font=("微软雅黑", 18), width=15, justify=tk.CENTER)
        self.entry_ans.pack(side=tk.LEFT)
        self.entry_ans.bind("<Return>", self.check_answer)  # 回车提交答案

        # 功能按钮
        frame_btn = tk.Frame(self.root, pady=25)
        frame_btn.pack()
        tk.Button(frame_btn, text="提交答案", command=self.check_answer, 
                  font=("微软雅黑", 12), width=10, bg="#4CAF50", fg="white").pack(side=tk.LEFT, padx=10)
        tk.Button(frame_btn, text="下一题", command=self.generate_question, 
                  font=("微软雅黑", 12), width=10, bg="#2196F3", fg="white").pack(side=tk.LEFT, padx=10)
        tk.Button(frame_btn, text="重置统计", command=self.reset_all, 
                  font=("微软雅黑", 12), width=10, bg="#FF9800", fg="white").pack(side=tk.LEFT, padx=10)

        # 提示信息
        self.label_tip = tk.Label(self.root, text="选择模式后即可开始练习，回车可快速答题", 
                                  font=("微软雅黑", 10), fg="#666666")
        self.label_tip.pack(pady=5)

    def switch_mode(self):
        # 切换练习模式，重置题目
        self.mode = self.var_mode.get()
        self.generate_question()
        self.label_tip.config(text=f"已切换为：{'乘法口诀练习' if self.mode=='multi' else '四则运算练习'}")

    def generate_question(self):
        # 清空输入框
        self.entry_ans.delete(0, tk.END)
        # 记录开始答题时间
        self.start_time = time.time()

        if self.mode == "multi":
            # 生成乘法口诀题目 1-9
            a = random.randint(1, 9)
            b = random.randint(1, 9)
            self.question = f"{a} × {b} ="
            self.answer = a * b
        else:
            # 生成四则运算题目（加减乘除，整除无余数）
            ops = ["+", "-", "×", "÷"]
            op = random.choice(ops)
            if op == "+":
                a = random.randint(1, 99)
                b = random.randint(1, 99)
                self.answer = a + b
            elif op == "-":
                # 保证结果为正数
                a = random.randint(1, 99)
                b = random.randint(1, a)
                self.answer = a - b
            elif op == "×":
                a = random.randint(2, 20)
                b = random.randint(2, 20)
                self.answer = a * b
            else:
                # 除法保证整除
                b = random.randint(2, 10)
                res = random.randint(1, 10)
                a = b * res
                self.answer = res
            self.question = f"{a} {op} {b} ="
        
        # 更新题目显示
        self.label_question.config(text=self.question)

    def check_answer(self, event=None):
        # 获取用户答案并校验
        user_input = self.entry_ans.get().strip()
        if not user_input.isdigit():
            messagebox.showwarning("输入错误", "请输入纯数字答案！")
            return
        
        user_ans = int(user_input)
        self.count += 1

        if user_ans == self.answer:
            # 答对加分
            self.score += 10
            self.label_tip.config(text="✅ 回答正确！继续加油", fg="green")
        else:
            # 答错统计错题
            self.wrong_count += 1
            self.label_tip.config(text=f"❌ 回答错误，正确答案是：{self.answer}", fg="red")
        
        # 更新统计面板
        self.label_score.config(text=f"得分：{self.score} | 答题：{self.count} | 错题：{self.wrong_count}")

    def reset_all(self):
        # 重置所有统计数据
        self.score = 0
        self.count = 0
        self.wrong_count = 0
        self.label_score.config(text=f"得分：0 | 答题：0 | 错题：0")
        self.label_tip.config(text="数据已重置，开始新的练习吧", fg="#666666")
        self.generate_question()

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