import tkinter as tk
from tkinter import ttk, messagebox # messagebox在这里可能用处不大，但保留以防未来扩展

class FormulaFinderApp:
    def __init__(self, master):
        self.master = master
        master.title("数学公式查询")
        master.geometry("700x500") # 设置窗口初始大小
        master.minsize(500, 400) # 设置最小窗口大小

        # 预设的数学公式
        self.formulas = {
            "二次方程求根公式": "x = (-b ± √(b² - 4ac)) / 2a",
            "勾股定理": "a² + b² = c²",
            "圆的面积": "A = πr²",
            "圆的周长": "C = 2πr",
            "欧拉公式 (复数)": "e^(ix) = cos(x) + i sin(x)",
            "牛顿第二定律": "F = ma",
            "速度公式": "v = s / t",
            "加速度公式": "a = (v_f - v_i) / t",
            "能量守恒定律": "E_total = E_kinetic + E_potential",
            "对数运算法则": "log_b(xy) = log_b(x) + log_b(y)\nlog_b(x/y) = log_b(x) - log_b(y)\nlog_b(x^n) = n * log_b(x)",
            "三角函数基本关系": "sin²θ + cos²θ = 1\ntanθ = sinθ / cosθ",
            "微积分基本定理": "∫[a,b] f'(x) dx = f(b) - f(a)",
            "导数定义": "f'(x) = lim (h->0) [f(x+h) - f(x)] / h",
            "积分定义": "∫f(x)dx = F(x) + C (其中 F'(x) = f(x))",
            "矩阵乘法": "(AB)_ij = Σ_k A_ik B_kj",
            "傅里叶变换": "F(ω) = ∫(-∞ to ∞) f(t) e^(-iωt) dt",
            "相对论质能方程": "E = mc²"
        }

        self.setup_ui(master)

    def setup_ui(self, master):
        """设置用户界面布局和组件"""
        master.grid_rowconfigure(0, weight=0) # 搜索区域不伸缩
        master.grid_rowconfigure(1, weight=1) # 列表和显示区域伸缩
        master.grid_columnconfigure(0, weight=1) # 列表区域伸缩
        master.grid_columnconfigure(1, weight=2) # 显示区域伸缩

        # --- 搜索区域 ---
        search_panel = ttk.LabelFrame(master, text="搜索公式")
        search_panel.grid(row=0, column=0, columnspan=2, padx=5, pady=5, sticky="ew")

        ttk.Label(search_panel, text="搜索关键词:").grid(row=0, column=0, padx=5, pady=2, sticky="w")
        self.search_entry = ttk.Entry(search_panel)
        self.search_entry.grid(row=0, column=1, padx=5, pady=2, sticky="ew")
        self.search_entry.bind("<Return>", lambda event: self.search_formula()) # 绑定回车键

        search_btn = ttk.Button(search_panel, text="搜索", command=self.search_formula)
        search_btn.grid(row=0, column=2, padx=5, pady=2)

        clear_search_btn = ttk.Button(search_panel, text="清空搜索", command=self.clear_search)
        clear_search_btn.grid(row=0, column=3, padx=5, pady=2)

        search_panel.grid_columnconfigure(1, weight=1) # 让搜索框可以伸缩

        # --- 公式列表区域 ---
        formula_list_panel = ttk.LabelFrame(master, text="所有公式")
        formula_list_panel.grid(row=1, column=0, padx=5, pady=5, sticky="nsew")

        self.formula_listbox = tk.Listbox(formula_list_panel)
        self.formula_listbox.pack(side="left", fill="both", expand=True)
        scrollbar_list = ttk.Scrollbar(formula_list_panel, orient="vertical", command=self.formula_listbox.yview)
        scrollbar_list.pack(side="right", fill="y")
        self.formula_listbox.config(yscrollcommand=scrollbar_list.set)
        self.formula_listbox.bind("<<ListboxSelect>>", self.display_selected_formula)

        # --- 公式显示区域 ---
        formula_display_panel = ttk.LabelFrame(master, text="公式内容")
        formula_display_panel.grid(row=1, column=1, padx=5, pady=5, sticky="nsew")

        self.formula_text = tk.Text(formula_display_panel, wrap="word", state="disabled", font=("Consolas", 12))
        self.formula_text.pack(side="left", fill="both", expand=True)
        scrollbar_text = ttk.Scrollbar(formula_display_panel, orient="vertical", command=self.formula_text.yview)
        scrollbar_text.pack(side="right", fill="y")
        self.formula_text.config(yscrollcommand=scrollbar_text.set)

        self.update_formula_listbox(list(self.formulas.keys())) # 初始化显示所有公式名称
        self.display_formula("请在上方输入关键词搜索，或从左侧列表中选择公式。") # 初始提示

    def update_formula_listbox(self, formula_names):
        """更新公式列表框的显示"""
        self.formula_listbox.delete(0, tk.END)
        for name in sorted(formula_names): # 按字母顺序排序
            self.formula_listbox.insert(tk.END, name)

    def search_formula(self):
        """根据关键词搜索公式"""
        keyword = self.search_entry.get().strip().lower()
        if not keyword:
            self.update_formula_listbox(list(self.formulas.keys())) # 显示所有公式
            self.display_formula("请在上方输入关键词搜索，或从左侧列表中选择公式。")
            return

        found_names = [name for name in self.formulas.keys() if keyword in name.lower()]
        if found_names:
            self.update_formula_listbox(found_names)
            if len(found_names) == 1:
                # 如果只找到一个，自动选中并显示其内容
                self.formula_listbox.selection_set(0)
                self.formula_listbox.event_generate("<<ListboxSelect>>") # 触发选择事件
            else:
                self.display_formula(f"找到 {len(found_names)} 条结果，请从列表中选择。")
        else:
            self.update_formula_listbox([]) # 清空列表
            self.display_formula("未找到相关公式。")

    def clear_search(self):
        """清空搜索框并显示所有公式"""
        self.search_entry.delete(0, tk.END)
        self.update_formula_listbox(list(self.formulas.keys()))
        self.display_formula("请在上方输入关键词搜索，或从左侧列表中选择公式。")

    def display_selected_formula(self, event=None):
        """显示选中的公式内容"""
        selected_indices = self.formula_listbox.curselection()
        if selected_indices:
            selected_name = self.formula_listbox.get(selected_indices[0])
            formula_content = self.formulas.get(selected_name, "公式内容未找到。")
            self.display_formula(formula_content)
        else:
            self.display_formula("请从左侧列表中选择一个公式。")

    def display_formula(self, text_content):
        """在公式显示区域显示文本"""
        self.formula_text.config(state="normal") # 允许编辑
        self.formula_text.delete(1.0, tk.END)
        self.formula_text.insert(tk.END, text_content)
        self.formula_text.config(state="disabled") # 禁止编辑

# 主程序入口
if __name__ == "__main__":
    root = tk.Tk()
    app = FormulaFinderApp(root)
    root.mainloop()