import tkinter as tk
from tkinter import ttk, messagebox
import pandas as pd

# 1. 准备公式库数据 (你可以根据需要在这里添加更多)
data = [
    {"分类": "代数", "名称": "平方差公式", "公式": "a² - b² = (a+b)(a-b)", "说明": "基础因式分解"},
    {"分类": "代数", "名称": "一元二次方程求根",
        "公式": "x = [-b ± √(b²-4ac)] / 2a", "说明": "判别式 Δ = b²-4ac"},
    {"分类": "三角函数", "名称": "勾股定理", "公式": "a² + b² = c²", "说明": "直角三角形边长关系"},
    {"分类": "三角函数", "名称": "正弦定理", "公式": "a/sinA = b/sinB = c/sinC = 2R", "说明": "R为外接圆半径"},
    {"分类": "微积分", "名称": "导数定义",
        "公式": "f'(x) = lim(Δx→0) [f(x+Δx)-f(x)]/Δx", "说明": "变化率的极限"},
    {"分类": "微积分", "名称": "牛顿-莱布尼茨公式",
        "公式": "∫(a,b) f(x)dx = F(b) - F(a)", "说明": "定积分基本定理"},
    {"分类": "几何", "名称": "圆面积", "公式": "S = πr²", "说明": "r为半径"},
    {"分类": "几何", "名称": "球体体积", "公式": "V = (4/3)πr³", "说明": "r为半径"}
]

df = pd.DataFrame(data)


class MathFormulaApp:
    def __init__(self, root):
        self.root = root
        self.root.title("数学公式快捷查询手册")
        self.root.geometry("700x500")

        # --- 搜索栏 ---
        search_frame = tk.Frame(self.root, pady=10)
        search_frame.pack(fill=tk.X)

        tk.Label(search_frame, text="搜索公式: ").pack(side=tk.LEFT, padx=10)
        self.search_var = tk.StringVar()
        self.search_var.trace("w", self.update_list)  # 输入时自动触发搜索
        self.search_entry = tk.Entry(
            search_frame, textvariable=self.search_var, width=40)
        self.search_entry.pack(side=tk.LEFT, padx=5)

        # --- 列表显示区 ---
        list_frame = tk.Frame(self.root)
        list_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)

        columns = ("分类", "名称", "公式")
        self.tree = ttk.Treeview(list_frame, columns=columns, show="headings")

        for col in columns:
            self.tree.heading(col, text=col)
            self.tree.column(col, width=150)

        self.tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

        # 滚动条
        scrollbar = ttk.Scrollbar(
            list_frame, orient=tk.VERTICAL, command=self.tree.yview)
        self.tree.configure(yscroll=scrollbar.set)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

        # 绑定点击事件
        self.tree.bind("<<TreeviewSelect>>", self.show_details)

        # --- 详情显示区 ---
        self.detail_label = tk.Label(self.root, text="点击上方公式查看详情", font=("微软雅黑", 12),
                                     fg="blue", pady=20, wraplength=600)
        self.detail_label.pack()

        self.update_list()

    def update_list(self, *args):
        # 清空当前列表
        for item in self.tree.get_children():
            self.tree.delete(item)

        search_term = self.search_var.get().lower()

        # 过滤数据
        filtered_df = df[
            df['名称'].str.contains(search_term) |
            df['分类'].str.contains(search_term) |
            df['公式'].str.contains(search_term)
        ]

        for _, row in filtered_df.iterrows():
            self.tree.insert("", tk.END, values=(
                row['分类'], row['名称'], row['公式']))

    def show_details(self, event):
        selected_item = self.tree.selection()
        if selected_item:
            item_data = self.tree.item(selected_item)['values']
            # 从原始数据中找说明
            desc = df[df['名称'] == item_data[1]]['说明'].values[0]
            display_text = f"名称: {item_data[1]}\n\n公式: {item_data[2]}\n\n备注: {desc}"
            self.detail_label.config(text=display_text)


if __name__ == "__main__":
    root = tk.Tk()
    app = MathFormulaApp(root)
    root.mainloop()
