import tkinter as tk
from tkinter import ttk, messagebox

# 数学公式数据库：分类 -> [(公式名称, 公式内容, 说明)]
formula_data = {
    "代数": [
        ("一元二次方程求根", "x = [-b ± √(b²-4ac)] / 2a", "ax²+bx+c=0，判别式Δ=b²-4ac"),
        ("完全平方和", "(a+b)² = a² + 2ab + b²", "两数和的平方展开"),
        ("完全平方差", "(a-b)² = a² - 2ab + b²", "两数差的平方展开"),
        ("平方差", "a² - b² = (a+b)(a-b)", "因式分解常用公式"),
        ("立方和", "a³+b³=(a+b)(a²-ab+b²)", "立方和分解"),
        ("立方差", "a³-b³=(a-b)(a²+ab+b²)", "立方差分解")
    ],
    "平面几何": [
        ("三角形面积1", "S = 1/2 × 底 × 高", "普通三角形面积"),
        ("三角形面积2", "S = 1/2ab·sinC", "已知两边及夹角"),
        ("圆周长", "C = 2πr", "r为圆半径"),
        ("圆面积", "S = πr²", "r为圆半径"),
        ("梯形面积", "S=(上底+下底)×高/2", "梯形面积计算公式"),
        ("勾股定理", "a² + b² = c²", "直角三角形，c为斜边")
    ],
    "三角函数": [
        ("正弦定义", "sinα = 对边/斜边", "直角三角形正弦"),
        ("余弦定义", "cosα = 邻边/斜边", "直角三角形余弦"),
        ("正切定义", "tanα = sinα/cosα", "正切公式"),
        ("同角平方关系", "sin²α + cos²α = 1", "万能三角恒等式"),
        ("二倍角正弦", "sin2α = 2sinαcosα", "二倍角公式"),
        ("二倍角余弦", "cos2α=cos²α-sin²α", "余弦二倍角变形")
    ],
    "微积分": [
        ("幂函数导数", "(xⁿ)' = n·xⁿ⁻¹", "基础求导公式"),
        ("指数导数", "(eˣ)' = eˣ", "自然指数求导"),
        ("正弦导数", "(sinx)' = cosx", "三角函数求导"),
        ("余弦导数", "(cosx)' = -sinx", "三角函数求导"),
        ("基本积分", "∫xⁿdx = xⁿ⁺¹/(n+1)+C", "不定积分，C为常数"),
        ("指数积分", "∫eˣdx = eˣ + C", "自然指数积分")
    ]
}

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

        # 顶部搜索区域
        top_frame = ttk.Frame(root, padding=10)
        top_frame.pack(fill="x")

        ttk.Label(top_frame, text="关键词搜索：", font=("微软雅黑", 11)).grid(row=0, column=0, padx=5)
        self.search_var = tk.StringVar()
        search_entry = ttk.Entry(top_frame, textvariable=self.search_var, width=40, font=("微软雅黑",11))
        search_entry.grid(row=0, column=1, padx=5)
        search_btn = ttk.Button(top_frame, text="查询", command=self.search_formula)
        search_btn.grid(row=0, column=2, padx=5)
        clear_btn = ttk.Button(top_frame, text="清空", command=self.clear_all)
        clear_btn.grid(row=0, column=3, padx=5)

        # 中间主体：左侧分类 + 右侧公式列表
        main_frame = ttk.Frame(root, padding=10)
        main_frame.pack(fill="both", expand=True)

        # 左侧分类栏
        left_frame = ttk.LabelFrame(main_frame, text="公式分类", padding=10)
        left_frame.pack(side="left", fill="y", padx=(0,10))
        self.category_list = tk.Listbox(left_frame, width=12, font=("微软雅黑",11))
        self.category_list.pack(fill="y")
        # 加载分类
        for cate in formula_data.keys():
            self.category_list.insert(tk.END, cate)
        self.category_list.bind("<<ListboxSelect>>", self.select_category)

        # 右侧公式表格
        right_frame = ttk.LabelFrame(main_frame, text="公式列表", padding=10)
        right_frame.pack(side="right", fill="both", expand=True)

        # 表格控件 Treeview
        self.tree = ttk.Treeview(right_frame, columns=("formula", "desc"), show="headings")
        self.tree.heading("#0", text="名称")
        self.tree.heading("formula", text="公式表达式")
        self.tree.heading("desc", text="说明")
        self.tree.column("#0", width=160)
        self.tree.column("formula", width=320)
        self.tree.column("desc", width=240)
        self.tree.pack(fill="both", expand=True)

        # 底部详情展示
        bottom_frame = ttk.LabelFrame(root, text="公式详情", padding=10)
        bottom_frame.pack(fill="x", padx=10, pady=(0,10))
        self.detail_text = tk.Text(bottom_frame, height=4, font=("微软雅黑",11))
        self.detail_text.pack(fill="x")
        self.tree.bind("<<TreeviewSelect>>", self.show_detail)

    # 根据分类筛选公式
    def select_category(self, event):
        self.clear_tree()
        idx = self.category_list.curselection()
        if not idx:
            return
        cate_name = self.category_list.get(idx[0])
        formula_list = formula_data[cate_name]
        for name, formula, desc in formula_list:
            self.tree.insert("", tk.END, text=name, values=(formula, desc))

    # 关键词搜索
    def search_formula(self):
        keyword = self.search_var.get().strip()
        if not keyword:
            messagebox.showwarning("提示", "请输入搜索关键词！")
            return
        self.clear_tree()
        # 遍历全部公式匹配
        for cate in formula_data.values():
            for name, formula, desc in cate:
                if keyword in name or keyword in formula or keyword in desc:
                    self.tree.insert("", tk.END, text=name, values=(formula, desc))

    # 清空表格
    def clear_tree(self):
        for item in self.tree.get_children():
            self.tree.delete(item)

    # 清空全部内容
    def clear_all(self):
        self.search_var.set("")
        self.clear_tree()
        self.detail_text.delete(1.0, tk.END)
        self.category_list.selection_clear(0, tk.END)

    # 选中表格行展示详情
    def show_detail(self, event):
        self.detail_text.delete(1.0, tk.END)
        sel = self.tree.selection()
        if not sel:
            return
        item = self.tree.item(sel[0])
        name = item["text"]
        formula, desc = item["values"]
        info = f"公式名称：{name}\n表达式：{formula}\n备注说明：{desc}"
        self.detail_text.insert(1.0, info)

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