import tkinter as tk
from tkinter import ttk, scrolledtext

# 数学公式数据库，可自行扩充
formula_data = [
    {"name": "一元二次方程求根公式",
     "formula": "x = [-b ± √(b² - 4ac)] / 2a",
     "desc": "方程 ax²+bx+c=0 (a≠0)，Δ=b²-4ac"},
    {"name": "两点间距离公式",
     "formula": "d = √[(x₂-x₁)² + (y₂-y₁)²]",
     "desc": "平面两点 (x₁,y₁) 与 (x₂,y₂) 的直线距离"},
    {"name": "勾股定理",
     "formula": "a² + b² = c²",
     "desc": "直角三角形，c为斜边"},
    {"name": "三角形面积（底高）",
     "formula": "S = 1/2 * a * h",
     "desc": "a底边长，h对应高"},
    {"name": "圆面积",
     "formula": "S = πr²",
     "desc": "r为圆半径"},
    {"name": "圆周长",
     "formula": "C = 2πr",
     "desc": "r为圆半径"},
    {"name": "正弦基础公式",
     "formula": "sinα = 对边 / 斜边",
     "desc": "直角三角形三角函数"},
    {"name": "余弦基础公式",
     "formula": "cosα = 邻边 / 斜边",
     "desc": "直角三角形三角函数"},
    {"name": "正切基础公式",
     "formula": "tanα = sinα/cosα",
     "desc": "tanα = 对边 / 邻边"},
    {"name": "sin²+cos²恒等式",
     "formula": "sin²α + cos²α = 1",
     "desc": "最常用三角恒等式"},
    {"name": "等差数列通项",
     "formula": "aₙ = a₁ + (n-1)d",
     "desc": "a₁首项，d公差，n项数"},
    {"name": "等差数列求和",
     "formula": "Sₙ = n(a₁+aₙ)/2",
     "desc": "等差数列前n项和"},
    {"name": "等比数列通项",
     "formula": "aₙ = a₁ * q^(n-1)",
     "desc": "a₁首项，q公比"},
    {"name": "完全平方和",
     "formula": "(a+b)² = a²+2ab+b²",
     "desc": "代数恒等式"},
    {"name": "完全平方差",
     "formula": "(a-b)² = a²-2ab+b²",
     "desc": "代数恒等式"},
    {"name": "平方差公式",
     "formula": "a²-b² = (a+b)(a-b)",
     "desc": "因式分解常用公式"},
]


class FormulaQueryApp:
    def __init__(self, root):
        self.root = root
        self.root.title("数学公式查询工具")
        self.root.geometry("700x520")  # 窗口大小

        # 顶部搜索区域
        frame_top = ttk.Frame(root, padding=10)
        frame_top.pack(fill=tk.X)

        ttk.Label(frame_top, text="搜索公式：").pack(side=tk.LEFT)
        self.search_var = tk.StringVar()
        entry = ttk.Entry(frame_top, textvariable=self.search_var, width=40)
        entry.pack(side=tk.LEFT, padx=8)
        entry.bind("<Return>", self.search_formula)  # 回车搜索

        btn_search = ttk.Button(frame_top, text="查询", command=self.search_formula)
        btn_search.pack(side=tk.LEFT)
        btn_reset = ttk.Button(frame_top, text="清空", command=self.reset_all)
        btn_reset.pack(side=tk.LEFT, padx=5)

        # 中间列表区域
        frame_mid = ttk.Frame(root, padding=(10, 0))
        frame_mid.pack(fill=tk.BOTH, expand=True)

        ttk.Label(frame_mid, text="搜索结果（点击查看详情）").pack(anchor="w")
        # 滚动列表
        self.listbox = tk.Listbox(frame_mid, height=12, font=("微软雅黑", 11))
        scroll = ttk.Scrollbar(frame_mid, orient=tk.VERTICAL, command=self.listbox.yview)
        self.listbox.config(yscrollcommand=scroll.set)

        self.listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        scroll.pack(side=tk.RIGHT, fill=tk.Y)
        self.listbox.bind("<<ListboxSelect>>", self.on_select)

        # 底部详情展示区
        frame_bottom = ttk.Frame(root, padding=10)
        frame_bottom.pack(fill=tk.X)
        ttk.Label(frame_bottom, text="公式详情：").pack(anchor="w")
        self.detail_text = scrolledtext.ScrolledText(frame_bottom, height=6, font=("微软雅黑", 11))
        self.detail_text.pack(fill=tk.X)

        # 保存当前筛选后的公式列表
        self.match_list = []

    def search_formula(self, event=None):
        keyword = self.search_var.get().lower().strip()
        self.listbox.delete(0, tk.END)
        self.match_list.clear()

        if not keyword:
            return

        # 模糊匹配：名称、公式、描述包含关键词
        for item in formula_data:
            text_all = (item["name"] + item["formula"] + item["desc"]).lower()
            if keyword in text_all:
                self.match_list.append(item)
                self.listbox.insert(tk.END, item["name"])

        if not self.match_list:
            self.listbox.insert(tk.END, "未找到匹配公式")
        self.detail_text.delete(1.0, tk.END)

    def on_select(self, event):
        select_idx = self.listbox.curselection()
        if not select_idx:
            return
        idx = select_idx[0]
        if idx >= len(self.match_list):
            return
        data = self.match_list[idx]

        self.detail_text.delete(1.0, tk.END)
        content = (
            f"公式名称：{data['name']}\n"
            f"公式表达式：{data['formula']}\n"
            f"说明：{data['desc']}"
        )
        self.detail_text.insert(tk.END, content)

    def reset_all(self):
        self.search_var.set("")
        self.listbox.delete(0, tk.END)
        self.match_list.clear()
        self.detail_text.delete(1.0, tk.END)


if __name__ == "__main__":
    window = tk.Tk()
    app = FormulaQueryApp(window)
    window.mainloop()