import tkinter as tk
from tkinter import ttk, scrolledtext, messagebox
import random
import math
import threading

# 生成题目与答案的函数
def generate_problems(n=500):
    problems = []
    for i in range(n):
        t = i % 10  # 用不同类型的题
        if t == 0:
            # 简单四则运算，保证整数结果
            a = random.randint(1, 50)
            b = random.randint(1, 50)
            op = random.choice(['+', '-', '*', '//'])
            if op == '//':
                b = random.randint(1, 10)
                expr = f"{a*b} // {b}"
                ans = (a*b) // b
                text = f"计算：{expr}（整除）"
            else:
                expr = f"{a} {op} {b}"
                ans = eval(expr)
                text = f"计算：{expr}"
            problems.append((f"#{i+1} {text}", str(ans), f"解析：{expr} 的结果是 {ans}"))
        elif t == 1:
            # 小数运算
            a = round(random.uniform(1, 20), 2)
            b = round(random.uniform(1, 20), 2)
            expr = f"{a} + {b}"
            ans = round(a + b, 4)
            problems.append((f"#{i+1} 计算：{a} + {b}", str(ans), f"解析：{a} + {b} = {ans}"))
        elif t == 2:
            # 一元二次方程求根（整数系数）
            a = random.randint(1, 5)
            b = random.randint(-10, 10)
            c = random.randint(-10, 10)
            disc = b*b - 4*a*c
            if disc < 0:
                # 改为有实根
                c = b*b // (4*a)
                disc = b*b - 4*a*c
            r1 = (-b + math.sqrt(disc)) / (2*a)
            r2 = (-b - math.sqrt(disc)) / (2*a)
            text = f"求方程 {a}x^2 + ({b})x + ({c}) = 0 的根"
            ans = f"x1={round(r1,6)}, x2={round(r2,6)}"
            problems.append((f"#{i+1} {text}", ans, f"解析：判别式={disc}，两根如上。"))
        elif t == 3:
            # 完整平方或因式分解
            a = random.randint(1,5)
            b = random.randint(1,10)
            text = f"因式分解：{a}x^2 + {2*a*b}x + {a*b*b}"
            ans = f"({a}x + {a*b})^2" if a!=0 else f"{a*b*b}"
            problems.append((f"#{i+1} {text}", ans, f"解析：这是完全平方。"))
        elif t == 4:
            # 基本三角恒等式判断
            theta = random.choice([0, 30, 45, 60, 90])
            text = f"计算 sin({theta}°), cos({theta}°), tan({theta}°)"
            def deg_to_val(d):
                if d==0: return (0,1,0)
                if d==30: return (0.5, math.sqrt(3)/2, 1/math.sqrt(3))
                if d==45: return (math.sqrt(2)/2, math.sqrt(2)/2, 1)
                if d==60: return (math.sqrt(3)/2, 0.5, math.sqrt(3))
                if d==90: return (1,0,float('inf'))
            s,c,tanv = deg_to_val(theta)
            ans = f"sin={round(s,6)}, cos={round(c,6)}, tan={round(tanv,6) if tanv!=float('inf') else '无穷'}"
            problems.append((f"#{i+1} {text}", ans, f"解析：常见角值。"))
        elif t == 5:
            # 导数：多项式
            a = random.randint(1,5)
            b = random.randint(-5,5)
            c = random.randint(-5,5)
            text = f"求导：f(x)={a}x^2 + {b}x + {c}"
            ans = f"f'(x)={2*a}x + {b}"
            problems.append((f"#{i+1} {text}", ans, f"解析：多项式求导。"))
        elif t == 6:
            # 积分：简单多项式不定积分
            a = random.randint(1,5)
            b = random.randint(-5,5)
            text = f"求不定积分：∫ ({a}x + {b}) dx"
            ans = f"{a/2}x^2 + {b}x + C"
            problems.append((f"#{i+1} {text}", ans, "解析：按幂次积分。"))
        elif t == 7:
            # 组合数或排列数
            n0 = random.randint(5,15)
            k0 = random.randint(0,n0)
            from math import comb
            val = comb(n0,k0)
            text = f"计算组合数 C({n0},{k0})"
            problems.append((f"#{i+1} {text}", str(val), f"解析：组合数值为 {val}"))
        elif t == 8:
            # 等比或等差数列求和
            a1 = random.randint(1,10)
            d = random.randint(1,5)
            n0 = random.randint(3,10)
            s = n0*(2*a1+(n0-1)*d)//2
            text = f"等差数列前 {n0} 项和，首项={a1}, 公差={d}"
            problems.append((f"#{i+1} {text}", str(s), f"解析：使用前 n 项和公式。"))
        else:
            # 随机文本题（例如证明或恒等式）
            text = f"判断或说明：下列恒等式是否成立（例）：sin^2 x + cos^2 x = 1"
            ans = "成立"
            problems.append((f"#{i+1} {text}", ans, "解析：基本三角恒等式。"))
    return problems

class MathQuizApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("数学公式查询器")
        self.geometry("900x600")

        self.problems = generate_problems(500)

        # 左侧题目列表
        left_frame = ttk.Frame(self)
        left_frame.pack(side=tk.LEFT, fill=tk.Y, padx=5, pady=5)

        lbl = ttk.Label(left_frame, text="题目列表（双击查看）")
        lbl.pack(anchor="w")

        self.listbox = tk.Listbox(left_frame, width=40, height=30)
        for p in self.problems:
            self.listbox.insert(tk.END, p[0])
        self.listbox.pack(side=tk.LEFT, fill=tk.Y)
        self.listbox.bind("<Double-Button-1>", self.on_select)

        scrollbar = ttk.Scrollbar(left_frame, orient="vertical", command=self.listbox.yview)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        self.listbox.config(yscrollcommand=scrollbar.set)

        # 右侧显示区
        right_frame = ttk.Frame(self)
        right_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True, padx=5, pady=5)

        btn_frame = ttk.Frame(right_frame)
        btn_frame.pack(fill=tk.X)

        self.random_btn = ttk.Button(btn_frame, text="随机抽题", command=self.random_problem)
        self.random_btn.pack(side=tk.LEFT, padx=5, pady=5)

        self.show_answer_btn = ttk.Button(btn_frame, text="显示答案/解析", command=self.show_answer)
        self.show_answer_btn.pack(side=tk.LEFT, padx=5, pady=5)

        self.search_var = tk.StringVar()
        search_entry = ttk.Entry(btn_frame, textvariable=self.search_var)
        search_entry.pack(side=tk.LEFT, padx=5)
        search_entry.bind("<Return>", lambda e: self.search())

        search_btn = ttk.Button(btn_frame, text="搜索", command=self.search)
        search_btn.pack(side=tk.LEFT, padx=5)

        self.problem_title = ttk.Label(right_frame, text="题目将显示在此处", font=("Arial", 14))
        self.problem_title.pack(anchor="nw", pady=5)

        self.problem_text = scrolledtext.ScrolledText(right_frame, wrap=tk.WORD, height=12)
        self.problem_text.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)

        ans_lbl = ttk.Label(right_frame, text="答案/解析：")
        ans_lbl.pack(anchor="nw")
        self.answer_text = scrolledtext.ScrolledText(right_frame, wrap=tk.WORD, height=8, foreground="blue")
        self.answer_text.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
        self.answer_text.config(state=tk.DISABLED)

        # 状态栏
        self.status = ttk.Label(self, text="共 500 题", relief=tk.SUNKEN, anchor="w")
        self.status.pack(side=tk.BOTTOM, fill=tk.X)

        # 当前索引
        self.current_index = None

    def on_select(self, event=None):
        sel = self.listbox.curselection()
        if not sel:
            return
        idx = sel[0]
        self.show_problem(idx)

    def show_problem(self, idx):
        title, ans, parse = self.problems[idx]
        self.current_index = idx
        self.problem_title.config(text=title)
        self.problem_text.delete(1.0, tk.END)
        # 显示题目详情（题目文本可能需要更多信息）
        self.problem_text.insert(tk.END, title + "\n\n" + "（详细说明）")
        self.answer_text.config(state=tk.NORMAL)
        self.answer_text.delete(1.0, tk.END)
        self.answer_text.insert(tk.END, "(答案已隐藏，点击“显示答案/解析”查看)")
        self.answer_text.config(state=tk.DISABLED)
        self.status.config(text=f"第 {idx+1} 题，共 {len(self.problems)} 题")

    def show_answer(self):
        if self.current_index is None:
            messagebox.showinfo("提示", "请先选择题目或随机抽题。")
            return
        _, ans, parse = self.problems[self.current_index]
        self.answer_text.config(state=tk.NORMAL)
        self.answer_text.delete(1.0, tk.END)
        self.answer_text.insert(tk.END, f"答案：{ans}\n\n{parse}")
        self.answer_text.config(state=tk.DISABLED)

    def random_problem(self):
        idx = random.randint(0, len(self.problems)-1)
        # 选中列表对应项
        self.listbox.selection_clear(0, tk.END)
        self.listbox.selection_set(idx)
        self.listbox.see(idx)
        self.show_problem(idx)

    def search(self):
        key = self.search_var.get().strip()
        if not key:
            messagebox.showinfo("提示", "请输入搜索关键词（例如：sin, 求导, 等差）")
            return
        found = []
        for i, p in enumerate(self.problems):
            if key.lower() in p[0].lower() or key.lower() in p[2].lower():
                found.append(i)
        if not found:
            messagebox.showinfo("搜索结果", "未找到匹配题目")
            return
        # 高亮并跳转到第一个找到的
        idx = found[0]
        self.listbox.selection_clear(0, tk.END)
        self.listbox.selection_set(idx)
        self.listbox.see(idx)
        self.show_problem(idx)
        messagebox.showinfo("搜索结果", f"找到 {len(found)} 条匹配，已跳转到第一个。")

if __name__ == "__main__":
    app = MathQuizApp()
    app.mainloop()