import tkinter as tk
from tkinter import ttk, scrolledtext

# 公式数据库：{分类:{公式名:"公式内容+说明"}}
formula_data = {
    "代数公式": {
        "平方差公式": "a²−b² = (a+b)(a−b)\n说明：两个数平方之差，因式分解常用",
        "完全平方和": "(a+b)² = a²+2ab+b²\n说明：两数和的平方展开",
        "完全平方差": "(a−b)² = a²−2ab+b²\n说明：两数差的平方展开",
        "一元一次方程": "ax+b=0  解：x = -b/a(a≠0)",
        "一元二次求根": "ax²+bx+c=0\nx=[-b±√(b²−4ac)]÷2a\n判别式Δ=b²−4ac"
    },
    "几何公式": {
        "长方形面积": "S = a×b  a长 b宽",
        "正方形面积": "S = a²  a边长",
        "三角形面积": "S = ah÷2  a底 h高",
        "圆面积": "S = πr²  r半径",
        "圆周长": "C = 2πr",
        "勾股定理": "a²+b²=c² 直角三角形，c斜边"
    },
    "三角函数": {
        "正弦": "sinα = 对边/斜边",
        "余弦": "cosα = 邻边/斜边",
        "正切": "tanα = 对边/邻边",
        "同角平方": "sin²α+cos²α=1"
    },
    "数列公式": {
        "等差数列通项": "an = a₁+(n−1)d",
        "等差数列求和": "Sn = n(a₁+an)/2",
        "等比通项": "an = a₁·q^(n−1)"
    }
}

class MathFormulaQuery:
    def __init__(self, root):
        self.root = root
        self.root.title("数学公式查询器")
        self.root.geometry("680x480")

        # 顶部搜索栏
        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()
        search_entry = ttk.Entry(frame_top, textvariable=self.search_var, width=35)
        search_entry.pack(side="left", padx=6)
        btn_search = ttk.Button(frame_top, text="查询", command=self.search_formula)
        btn_search.pack(side="left")

        # 中间：左侧分类列表 + 右侧详情框
        frame_mid = ttk.Frame(root, padding=5)
        frame_mid.pack(fill="both", expand=True)

        # 左侧分类树
        frame_left = ttk.Frame(frame_mid)
        frame_left.pack(side="left", fill="y", padx=(0,5))
        ttk.Label(frame_left, text="公式分类", font=("黑体",11)).pack()
        self.tree = ttk.Treeview(frame_left, height=15, show="tree")
        self.tree.pack()
        # 绑定点击事件
        self.tree.bind("<<TreeviewSelect>>", self.on_select)

        # 右侧显示区
        frame_right = ttk.Frame(frame_mid)
        frame_right.pack(side="right", fill="both", expand=True)
        ttk.Label(frame_right, text="公式详情", font=("黑体",11)).pack(anchor="w")
        self.text_box = scrolledtext.ScrolledText(frame_right, font=("微软雅黑",11))
        self.text_box.pack(fill="both", expand=True)

        # 底部清空按钮
        frame_bottom = ttk.Frame(root, padding=5)
        frame_bottom.pack(fill="x")
        ttk.Button(frame_bottom, text="清空内容", command=self.clear_text).pack()

        # 初始化分类树
        self.init_tree()

    def init_tree(self):
        """加载分类到树形菜单"""
        for cate in formula_data.keys():
            self.tree.insert("", "end", iid=cate, text=cate)

    def on_select(self, event):
        """点击分类，列出该分类全部公式"""
        item = self.tree.focus()
        if item not in formula_data:
            return
        self.clear_text()
        cate_dict = formula_data[item]
        for name, content in cate_dict.items():
            self.text_box.insert("end", f"【{name}】\n{content}\n\n")

    def search_formula(self):
        """关键词模糊搜索"""
        key = self.search_var.get().strip()
        if not key:
            return
        self.clear_text()
        flag = False
        for cate, dic in formula_data.items():
            for name, txt in dic.items():
                if key in name or key in txt:
                    flag = True
                    self.text_box.insert("end", f"[{cate}] 【{name}】\n{txt}\n\n")
        if not flag:
            self.text_box.insert("end", "未查询到相关公式！")

    def clear_text(self):
        self.text_box.delete(1.0, tk.END)

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