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

# ---------------------- 公式数据库 ----------------------
MATH_FORMULAS = {
    "代数公式": {
        "一元二次方程求根公式": "ax² + bx + c = 0\nx = [-b±√(b²-4ac)]/(2a)",
        "完全平方公式": "(a+b)² = a²+2ab+b²\n(a-b)² = a²-2ab+b²",
        "平方差公式": "a² - b² = (a+b)(a-b)",
        "等差数列求和": "Sₙ = n(a₁+aₙ)/2 = na₁ + n(n-1)d/2"
    },
    "几何公式": {
        "圆的周长与面积": "周长 C=2πr\n面积 S=πr²",
        "三角形面积": "S=底×高÷2\n海伦公式：S=√[p(p-a)(p-b)(p-c)]",
        "矩形/正方形": "矩形：S=长×宽，C=2(长+宽)\n正方形：S=a²，C=4a",
        "球体体积/表面积": "V=(4/3)πr³\nS=4πr²"
    },
    "三角函数公式": {
        "基本关系": "sin²α+cos²α=1\ntanα=sinα/cosα",
        "和角公式": "sin(α±β)=sinαcosβ±cosαsinβ\ncos(α±β)=cosαcosβ∓sinαsinβ",
        "倍角公式": "sin2α=2sinαcosα\ncos2α=cos²α-sin²α"
    },
    "微积分公式": {
        "基本导数": "(xⁿ)'=nxⁿ⁻¹\n(sinx)'=cosx\n(eˣ)'=eˣ",
        "基本积分": "∫xⁿdx = xⁿ⁺¹/(n+1)+C\n∫sinxdx = -cosx+C"
    }
}

# ---------------------- 主程序类 ----------------------
class MathFormulaFinder:
    def __init__(self, root):
        self.root = root
        self.root.title("数学公式查询工具 v1.0")
        self.root.geometry("650x500")  # 窗口大小
        self.root.resizable(False, False)

        # 1. 顶部：分类选择 + 搜索框
        top_frame = ttk.Frame(root, padding=10)
        top_frame.pack(fill=tk.X)

        # 公式分类下拉框
        ttk.Label(top_frame, text="选择分类：").grid(row=0, column=0, padx=5)
        self.category_var = tk.StringVar()
        self.category_combo = ttk.Combobox(
            top_frame, textvariable=self.category_var,
            values=list(MATH_FORMULAS.keys()), state="readonly", width=15
        )
        self.category_combo.grid(row=0, column=1, padx=5)
        self.category_combo.current(0)  # 默认选中第一个分类
        self.category_combo.bind("<<ComboboxSelected>>", self.update_formula_list)

        # 搜索框
        ttk.Label(top_frame, text="搜索公式：").grid(row=0, column=2, padx=5)
        self.search_var = tk.StringVar()
        self.search_entry = ttk.Entry(top_frame, textvariable=self.search_var, width=20)
        self.search_entry.grid(row=0, column=3, padx=5)
        self.search_entry.bind("<KeyRelease>", self.search_formula)  # 实时搜索

        # 2. 中间：公式列表 + 公式详情
        mid_frame = ttk.Frame(root, padding=10)
        mid_frame.pack(fill=tk.BOTH, expand=True)

        # 公式名称列表
        ttk.Label(mid_frame, text="公式列表：").grid(row=0, column=0, sticky=tk.N)
        self.formula_listbox = tk.Listbox(mid_frame, width=25, height=15)
        self.formula_listbox.grid(row=1, column=0, padx=5, sticky=tk.NSEW)
        self.formula_listbox.bind("<<ListboxSelect>>", self.show_formula_detail)

        # 滚动条
        list_scroll = ttk.Scrollbar(mid_frame, orient=tk.VERTICAL, command=self.formula_listbox.yview)
        list_scroll.grid(row=1, column=1, sticky=tk.NS)
        self.formula_listbox.config(yscrollcommand=list_scroll.set)

        # 公式详情展示
        ttk.Label(mid_frame, text="公式详情：").grid(row=0, column=2, sticky=tk.N)
        self.detail_text = scrolledtext.ScrolledText(mid_frame, width=45, height=15, font=("Arial", 11))
        self.detail_text.grid(row=1, column=2, padx=5, sticky=tk.NSEW)
        self.detail_text.config(state=tk.DISABLED)  # 默认不可编辑

        # 3. 底部：功能按钮
        btn_frame = ttk.Frame(root, padding=10)
        btn_frame.pack(fill=tk.X)
        ttk.Button(btn_frame, text="复制公式", command=self.copy_formula).pack(side=tk.RIGHT, padx=5)
        ttk.Button(btn_frame, text="清空内容", command=self.clear_all).pack(side=tk.RIGHT, padx=5)

        # 初始化加载公式
        self.update_formula_list()

    # 更新公式列表
    def update_formula_list(self, event=None):
        self.formula_listbox.delete(0, tk.END)
        category = self.category_var.get()
        for formula_name in MATH_FORMULAS[category].keys():
            self.formula_listbox.insert(tk.END, formula_name)

    # 搜索公式（实时匹配）
    def search_formula(self, event=None):
        keyword = self.search_var.get().strip()
        if not keyword:
            self.update_formula_list()
            return

        self.formula_listbox.delete(0, tk.END)
        category = self.category_var.get()
        for name, content in MATH_FORMULAS[category].items():
            if keyword in name or keyword in content:
                self.formula_listbox.insert(tk.END, name)

    # 显示选中的公式详情
    def show_formula_detail(self, event=None):
        selected = self.formula_listbox.curselection()
        if not selected:
            return
        self.detail_text.config(state=tk.NORMAL)
        self.detail_text.delete(1.0, tk.END)

        category = self.category_var.get()
        formula_name = self.formula_listbox.get(selected[0])
        formula_content = MATH_FORMULAS[category][formula_name]
        self.detail_text.insert(tk.END, f"【{formula_name}】\n\n{formula_content}")
        self.detail_text.config(state=tk.DISABLED)

    # 复制公式到剪贴板
    def copy_formula(self):
        content = self.detail_text.get(1.0, tk.END).strip()
        if not content:
            messagebox.showwarning("提示", "请先选择一个公式！")
            return
        self.root.clipboard_clear()
        self.root.clipboard_append(content)
        messagebox.showinfo("成功", "公式已复制到剪贴板！")

    # 清空所有内容
    def clear_all(self):
        self.search_var.set("")
        self.detail_text.config(state=tk.NORMAL)
        self.detail_text.delete(1.0, tk.END)
        self.detail_text.config(state=tk.DISABLED)
        self.update_formula_list()

# ---------------------- 运行程序 ----------------------
if __name__ == "__main__":
    root = tk.Tk()
    app = MathFormulaFinder(root)
    root.mainloop()