import tkinter as tk
from tkinter import ttk, messagebox

class MathFormulaApp:
    def __init__(self, root):
        self.root = root
        self.root.title("全能数学公式查询助手")
        self.root.geometry("800x550")

        # 模拟数据库：按分类存储公式
        self.formula_db = {
            "代数": {
                "平方差公式": "a² - b² = (a + b)(a - b)",
                "完全平方公式": "(a ± b)² = a² ± 2ab + b²",
                "求根公式": "x = [-b ± √(b² - 4ac)] / 2a",
                "对数换底公式": "log_a(b) = log_c(b) / log_c(a)"
            },
            "几何": {
                "勾股定理": "a² + b² = c² (直角三角形)",
                "圆面积公式": "S = πr²",
                "球体体积": "V = (4/3)πr³",
                "正弦定理": "a/sinA = b/sinB = c/sinC = 2R"
            },
            "三角函数": {
                "同角平方和": "sin²θ + cos²θ = 1",
                "二倍角正弦": "sin(2θ) = 2sinθcosθ",
                "二倍角余弦": "cos(2θ) = cos²θ - sin²θ = 2cos²θ - 1",
                "和角公式": "sin(α±β) = sinαcosβ ± cosαsinβ"
            },
            "微积分": {
                "导数定义": "f'(x) = lim(Δx→0) [f(x+Δx) - f(x)] / Δx",
                "牛顿-莱布尼茨": "∫[a,b] f(x)dx = F(b) - F(a)",
                "常用导数 (sin x)": "(sin x)' = cos x",
                "常用导数 (ln x)": "(ln x)' = 1/x"
            }
        }

        self._setup_ui()

    def _setup_ui(self):
        # --- 顶部搜索栏 ---
        search_frame = tk.Frame(self.root, pady=10)
        search_frame.pack(fill="x")
        
        tk.Label(search_frame, text="搜索公式:", font=("微软雅黑", 10)).pack(side="left", padx=10)
        self.search_var = tk.StringVar()
        self.search_var.trace("w", self._on_search) # 实时搜索
        self.search_entry = tk.Entry(search_frame, textvariable=self.search_var, font=("微软雅黑", 10))
        self.search_entry.pack(side="left", fill="x", expand=True, padx=10)

        # --- 中间主体区域 ---
        main_container = tk.Frame(self.root)
        main_container.pack(fill="both", expand=True, padx=10, pady=5)

        # 左侧分类树
        self.tree = ttk.Treeview(main_container, columns=("formula"), show="tree", selectmode="browse")
        self.tree.pack(side="left", fill="y")
        
        # 填充树状数据
        for category, formulas in self.formula_db.items():
            node = self.tree.insert("", "end", text=category, open=True)
            for name in formulas.keys():
                self.tree.insert(node, "end", text=name)
        
        self.tree.bind("<<TreeviewSelect>>", self._display_formula)

        # 右侧显示区域
        display_frame = tk.LabelFrame(main_container, text="公式详情", font=("微软雅黑", 12, "bold"), padx=20, pady=20)
        display_frame.pack(side="right", fill="both", expand=True, padx=(10, 0))

        self.name_label = tk.Label(display_frame, text="请选择一个公式", font=("微软雅黑", 14, "bold"), fg="#2196F3")
        self.name_label.pack(pady=(20, 10))

        # 公式内容显示框 (使用 Text 组件以便支持换行和复制)
        self.content_text = tk.Text(display_frame, font=("Consolas", 18), height=5, bg="#f9f9f9", relief="flat", state="disabled")
        self.content_text.pack(fill="x", pady=20)

        # --- 底部状态栏 ---
        self.status_var = tk.StringVar(value="准备就绪")
        status_bar = tk.Label(self.root, textvariable=self.status_var, bd=1, relief="sunken", anchor="w")
        status_bar.pack(side="bottom", fill="x")

    def _display_formula(self, event):
        selected_item = self.tree.selection()[0]
        item_text = self.tree.item(selected_item, "text")
        
        # 查找公式内容
        found_content = None
        for cat in self.formula_db.values():
            if item_text in cat:
                found_content = cat[item_text]
                break
        
        if found_content:
            self.name_label.config(text=item_text)
            self.content_text.config(state="normal")
            self.content_text.delete(1.0, tk.END)
            self.content_text.insert(tk.END, found_content)
            self.content_text.tag_add("center", "1.0", "end")
            self.content_text.tag_configure("center", justify='center')
            self.content_text.config(state="disabled")
            self.status_var.set(f"正在查看: {item_text}")

    def _on_search(self, *args):
        query = self.search_var.get().lower()
        # 清空当前树
        for item in self.tree.get_children():
            self.tree.delete(item)
        
        # 重新填充符合条件的
        for category, formulas in self.formula_db.items():
            # 如果分类名匹配或公式名匹配
            matching_formulas = {k: v for k, v in formulas.items() if query in k.lower() or query in category.lower()}
            
            if matching_formulas:
                node = self.tree.insert("", "end", text=category, open=True)
                for name in matching_formulas.keys():
                    self.tree.insert(node, "end", text=name)

if __name__ == "__main__":
    root = tk.Tk()
    # 尝试美化风格
    style = ttk.Style()
    style.configure("Treeview", font=("微软雅黑", 10), rowheight=25)
    
    app = MathFormulaApp(root)
    root.mainloop()