import tkinter as tk
from tkinter import ttk, messagebox
import random

class MathTrainer:
    def __init__(self, root):
        self.root = root
        self.root.title("计算小能手｜数学练习器")
        self.root.geometry("520x420")
        self.root.resizable(False, False)

        # 全局数据
        self.mode = tk.StringVar(value="四则运算")  # 两种模式：四则 / 乘法口诀
        self.right_num = 0    # 答对
        self.all_num = 0      # 总题数
        self.a = 0
        self.b = 0
        self.op = ""
        self.ans = 0

        # 顶部：模式选择
        top_frame = ttk.LabelFrame(root, text="练习模式选择")
        top_frame.pack(padx=10, pady=6, fill="x")
        ttk.Radiobutton(top_frame, text="四则运算", variable=self.mode, value="四则运算", command=self.next_question).grid(row=0, column=0, padx=15)
        ttk.Radiobutton(top_frame, text="九九乘法", variable=self.mode, value="九九乘法", command=self.next_question).grid(row=0, column=1, padx=15)
        ttk.Button(top_frame, text="重置分数", command=self.reset_score).grid(row=0, column=3, padx=10)

        # 题目显示区
        q_frame = ttk.LabelFrame(root, text="题目")
        q_frame.pack(padx=10, pady=6, fill="x")
        self.q_label = tk.Label(q_frame, text="0 + 0 = ?", font=("微软雅黑", 22))
        self.q_label.pack(pady=12)

        # 答案输入
        in_frame = ttk.LabelFrame(root, text="填写答案")
        in_frame.pack(padx=10, pady=6, fill="x")
        self.input_var = tk.StringVar()
        ans_entry = ttk.Entry(in_frame, textvariable=self.input_var, font=("",16), width=12)
        ans_entry.grid(row=0, column=0, padx=8, pady=8)
        ans_entry.focus()
        ttk.Button(in_frame, text="提交答案", command=self.check_ans).grid(row=0, column=1, padx=5)
        ttk.Button(in_frame, text="下一题", command=self.next_question).grid(row=0, column=2, padx=5)

        # 成绩统计
        res_frame = ttk.LabelFrame(root, text="答题统计")
        res_frame.pack(padx=10, pady=6, fill="both", expand=True)
        self.result_text = tk.Text(res_frame, height=7, font=("微软雅黑",11))
        self.result_text.pack(padx=5,pady=5, fill="both")

        # 初始化第一道题
        self.next_question()
        self.update_info()

    # 生成随机题目
    def next_question(self):
        self.input_var.set("")
        if self.mode.get() == "九九乘法":
            # 九九乘法 1~9
            self.a = random.randint(1,9)
            self.b = random.randint(1,9)
            self.op = "×"
            self.ans = self.a * self.b
        else:
            # 四则运算 加减乘，数值1~50，减法保证非负
            ops = ["+", "-", "×"]
            self.op = random.choice(ops)
            self.a = random.randint(1,50)
            self.b = random.randint(1,50)
            if self.op == "-" and self.a < self.b:
                self.a, self.b = self.b, self.a
            if self.op == "+":
                self.ans = self.a + self.b
            elif self.op == "-":
                self.ans = self.a - self.b
            else:
                self.ans = self.a * self.b
        self.q_label.config(text=f"{self.a} {self.op} {self.b} = ?")

    # 核对答案
    def check_ans(self):
        user_str = self.input_var.get().strip()
        if not user_str.isdigit():
            messagebox.showwarning("提示", "请输入数字答案！")
            return
        user_num = int(user_str)
        self.all_num += 1
        if user_num == self.ans:
            self.right_num +=1
            tip = f"✅回答正确！{self.a}{self.op}{self.b}={self.ans}\n"
        else:
            tip = f"❌答错啦，正确答案：{self.a}{self.op}{self.b}={self.ans}\n"
        self.update_info(tip)
        self.next_question()

    # 更新统计面板
    def update_info(self, new_tip=""):
        self.result_text.delete(1.0, tk.END)
        if self.all_num ==0:
            rate = 0.0
        else:
            rate = self.right_num / self.all_num *100
        info = f"总答题：{self.all_num} 道\n答对：{self.right_num} 道\n正确率：{rate:.1f}%\n\n"
        info += new_tip
        self.result_text.insert(tk.END, info)

    # 清空分数重置
    def reset_score(self):
        self.right_num =0
        self.all_num =0
        self.update_info()
        self.next_question()

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