import tkinter as tk
from tkinter import ttk, messagebox

class MathFormulaSearch:
    def __init__(self, root):
        self.root = root
        self.root.title("数学公式查询工具")
        self.root.geometry("850x600")

        # 公式数据库：分类: [(公式名称, 公式内容)]
        self.formula_data = {
            "一次函数": [
                ("一般式", "y = kx + b  (k≠0)"),
                ("正比例函数", "y = kx  (k≠0)"),
                ("斜率公式", "k = (y₂ - y₁) / (x₂ - x₁)")
            ],
            "二次函数": [
                ("一般式", "y = ax² + bx + c  (a≠0)"),
                ("顶点式", "y = a(x-h)² + k"),
                ("交点式", "y = a(x-x₁)(x-x₂)"),
                ("顶点横坐标", "x = -b/(2a)"),
                ("判别式", "Δ = b² - 4ac")
            ],
            "一元二次方程": [
                ("标准方程", "ax²+bx+c=0 (a≠0)"),
                ("求根公式", "x = [-b ± √(b²-4ac)] / 2a"),
                ("韦达定理", "x₁+x₂ = -b/a , x₁·x₂ = c/a")
            ],
            "三角函数": [
                ("正弦", "sinα = 对边/斜边"),
                ("余弦", "cosα = 邻边/斜边"),
                ("正切", "tanα = 对边/邻边"),
                ("平方关系", "sin²α + cos²α = 1"),
                ("和角公式", "sin(α+β)=sinαcosβ+cosαsinβ")
            ],
            "数列": [
                ("等差数列通项", "aₙ = a₁ + (n-1)d"),
                ("等差数列求和", "Sₙ = n(a₁+aₙ)/2"),
                ("等比数列通项", "aₙ = a₁·qⁿ⁻¹"),
                ("等比数列求和", "Sₙ = a₁(1-qⁿ)/(1-q) (q≠1)")
            ],
            "几何面积体积": [
                ("三角形面积", "S = 1/2 ah"),
                ("圆面积", "S = πr²"),
                ("圆周长", "L = 2πr"),
                ("球体积", "V = 4/3 πr³"),
                ("圆柱体积", "V = πr²h")
            ],
            "不等式": [
                ("完全平方公式", "(a±b)² = a²±2ab+b²"),
                ("平方差", "a² - b² = (a+b)(a-b)"),
                ("均值不等式", "(a+b)/2 ≥ √ab (a>0,b>0)")
            ]
        }

        self.all_formulas = []
        self.build_all_list()
        self.create_ui()

    def build_all_list(self):
        # 把所有公式整理成一维列表，用于搜索
        self.all_formulas.clear()
        for category, items in self.formula_data.items():
            for name, expr in items:
                self.all_formulas.append((category, name, expr))

    def create_ui(self):
        # 顶部搜索区域
        frame_top = tk.Frame(self.root, padx=10, pady=10)
        frame_top.pack(fill="x")

        ttk.Label(frame_top, text="关键词搜索：").pack(side="left")
        self.search_var = tk.StringVar()
        entry_search = ttk.Entry(frame_top, textvariable=self.search_var, width=45, font=("Microsoft YaHei", 11))
        entry_search.pack(side="left", padx=8)
        entry_search.bind("<KeyRelease>", self.do_search)

        btn_clear = ttk.Button(frame_top, text="清空", command=self.reset_all)
        btn_clear.pack(side="left", padx=5)

        # 主体区域 左右分割
        main_frame = tk.Frame(self.root)
        main_frame.pack(fill="both", expand=True, padx=10)

        # 左侧分类列表
        frame_left = tk.Frame(main_frame)
        frame_left.pack(side="left", fill="y")
        ttk.Label(frame_left, text="公式分类", font=("Microsoft YaHei", 10, "bold")).pack()
        self.tree_cat = ttk.Treeview(frame_left, height=18)
        self.tree_cat.pack()
        self.tree_cat["columns"] = ("name",)
        self.tree_cat.column("#0", width=0, stretch="no")
        self.tree_cat.column("name", width=120)
        self.tree_cat.heading("name", text="分类")
        # 加载分类
        for cat in self.formula_data.keys():
            self.tree_cat.insert("", "end", values=(cat,))
        self.tree_cat.bind("<<TreeviewSelect>>", self.on_category_select)

        # 右侧结果区域
        frame_right = tk.Frame(main_frame)
        frame_right.pack(side="right", fill="both", expand=True, padx=(10,0))

        ttk.Label(frame_right, text="公式列表（双击复制公式）", font=("Microsoft YaHei", 10, "bold")).pack(anchor="w")
        self.listbox = tk.Listbox(frame_right, font=("Microsoft YaHei", 11))
        scroll = ttk.Scrollbar(frame_right, command=self.listbox.yview)
        self.listbox.config(yscrollcommand=scroll.set)
        self.listbox.pack(side="left", fill="both", expand=True)
        scroll.pack(side="right", fill="y")
        self.listbox.bind("<Double-Button-1>", self.copy_formula)

        # 底部显示详情
        frame_bottom = tk.Frame(self.root, padx=10, pady=8)
        frame_bottom.pack(fill="x")
        ttk.Label(frame_bottom, text="选中公式：").pack(side="left")
        self.detail_label = ttk.Label(frame_bottom, text="", foreground="#003399", font=("Microsoft YaHei",12))
        self.detail_label.pack(side="left", padx=6)

    def do_search(self, event):
        keyword = self.search_var.get().lower()
        self.listbox.delete(0, tk.END)
        if not keyword:
            return
        for cat, name, expr in self.all_formulas:
            if keyword in name.lower() or keyword in expr.lower():
                self.listbox.insert(tk.END, f"【{cat}】{name}  →  {expr}")

    def on_category_select(self, event):
        sel = self.tree_cat.selection()
        if not sel:
            return
        item = self.tree_cat.item(sel[0])
        cat_name = item["values"][0]
        self.search_var.set("")
        self.listbox.delete(0, tk.END)
        for name, expr in self.formula_data[cat_name]:
            self.listbox.insert(tk.END, f"{name}  →  {expr}")

    def copy_formula(self, event):
        idx = self.listbox.curselection()
        if not idx:
            return
        text = self.listbox.get(idx[0])
        # 提取等号后面公式
        if "→" in text:
            formula_text = text.split("→")[-1].strip()
        else:
            formula_text = text
        self.root.clipboard_clear()
        self.root.clipboard_append(formula_text)
        self.detail_label.config(text=formula_text)
        messagebox.showinfo("复制成功", f"已复制：{formula_text}")

    def reset_all(self):
        self.search_var.set("")
        self.listbox.delete(0, tk.END)
        self.tree_cat.selection_remove(self.tree_cat.selection())
        self.detail_label.config(text="")

if __name__ == "__main__":
    win = tk.Tk()
    app = MathFormulaSearch(win)
    win.mainloop()