import tkinter as tk
from tkinter import ttk, scrolledtext

# 公式数据库 {关键词列表: 公式详情}
formula_data = [
    {
        "tags": ["一次函数", "直线"],
        "name": "一次函数",
        "formula": "y = kx + b\nk：斜率，b：y轴截距"
    },
    {
        "tags": ["二次函数", "抛物线"],
        "name": "二次函数一般式",
        "formula": "y = ax²+bx+c  (a≠0)\n顶点横坐标 x = -b/(2a)"
    },
    {
        "tags": ["求根公式", "一元二次方程"],
        "name": "一元二次方程求根公式",
        "formula": "ax²+bx+c=0\nx = [-b ± √(b²‑4ac)] / 2a\n判别式 Δ = b²‑4ac"
    },
    {
        "tags": ["平方差"],
        "name": "平方差公式",
        "formula": "a² − b² = (a+b)(a−b)"
    },
    {
        "tags": ["完全平方"],
        "name": "完全平方和/差",
        "formula": "(a+b)² = a²+2ab+b²\n(a−b)² = a²−2ab+b²"
    },
    {
        "tags": ["勾股定理", "直角三角形"],
        "name": "勾股定理",
        "formula": "a² + b² = c²\nc为斜边长度"
    },
    {
        "tags": ["三角形面积"],
        "name": "三角形面积",
        "formula": "S = 1/2 * 底 * 高\nS=1/2ab·sinC"
    },
    {
        "tags": ["圆面积", "圆周长"],
        "name": "圆形计算公式",
        "formula": "周长 C=2πr\n面积 S=πr²"
    },
    {
        "tags": ["sin", "cos", "tan", "三角函数"],
        "name": "基础三角函数",
        "formula": "sinα=对边/斜边\ncosα=邻边/斜边\ntanα=对边/邻边"
    },
    {
        "tags": ["等差数列"],
        "name": "等差数列通项",
        "formula": "an = a1+(n‑1)d\n前n项和 Sn=n(a1+an)/2"
    },
    {
        "tags": ["等比数列"],
        "name": "等比数列通项",
        "formula": "an = a1·q^(n‑1)\nSn=a1(1−qⁿ)/(1−q)"
    }
]


class FormulaSearchApp:
    def __init__(self, root):
        self.root = root
        self.root.title("数学公式查询工具")
        self.root.geometry("620x480")

        # 搜索栏
        frame_top = ttk.Frame(root, padding=8)
        frame_top.pack(fill="x")

        ttk.Label(frame_top, text="输入关键词搜索公式：").pack(side="left")
        self.search_var = tk.StringVar()
        self.entry = ttk.Entry(frame_top, textvariable=self.search_var, width=45)
        self.entry.pack(side="left", padx=6)
        self.btn_search = ttk.Button(frame_top, text="查询", command=self.search)
        self.btn_search.pack(side="left")

        # 列表框 展示匹配结果
        frame_list = ttk.Frame(root, padding=(8, 2, 8, 2))
        frame_list.pack(fill="both", expand=False)
        self.listbox = tk.Listbox(frame_list, height=6, font=("微软雅黑",10))
        list_scroll = ttk.Scrollbar(frame_list, orient="vertical", command=self.listbox.yview)
        self.listbox.configure(yscrollcommand=list_scroll.set)
        self.listbox.pack(side="left", fill="both", expand=True)
        list_scroll.pack(side="right", fill="y")
        self.listbox.bind("<<ListboxSelect>>", self.on_select_item)

        # 详情文本区
        ttk.Label(root, text="公式详情", font=("微软雅黑",11)).pack()
        self.text_view = scrolledtext.ScrolledText(root, height=14, font=("微软雅黑", 11))
        self.text_view.pack(fill="both", expand=True, padx=8, pady=4)

        self.item_cache = []
        self.show_all()

    def show_all(self):
        self.listbox.delete(0, tk.END)
        self.item_cache.clear()
        for item in formula_data:
            self.item_cache.append(item)
            self.listbox.insert(tk.END, item["name"])

    def search(self):
        key = self.search_var.get().strip().lower()
        self.listbox.delete(0, tk.END)
        self.item_cache.clear()
        if not key:
            self.show_all()
            return
        for item in formula_data:
            for tag in item["tags"]:
                if key in tag:
                    self.item_cache.append(item)
                    self.listbox.insert(tk.END, item["name"])
                    break

    def on_select_item(self, event):
        sel = self.listbox.curselection()
        if not sel:
            return
        idx = sel[0]
        data = self.item_cache[idx]
        self.text_view.delete(1.0, tk.END)
        info = f"公式名称：{data['name']}\n\n{data['formula']}"
        self.text_view.insert(tk.END, info)


if __name__ == "__main__":
    win = tk.Tk()
    app = FormulaSearchApp(win)
    win.mainloop()
