import tkinter as tk
from tkinter import ttk, scrolledtext, messagebox

# 数学公式库
MATH_FORMULAS = {
    "平方差": "a^2 - b^2 = (a + b)(a - b)",
    "完全平方和": "(a + b)^2 = a^2 + 2ab + b^2",
    "完全平方差": "(a - b)^2 = a^2 - 2ab + b^2",
    "一元二次方程求根": "x = [-b ± √(b²-4ac)] / 2a",
    "等差数列通项": "an = a1 + (n-1)d",
    "等差数列求和": "Sn = n(a1+an)/2",
    "圆周长": "C = 2πr",
    "圆面积": "S = πr^2",
    "三角形面积": "S = a*h/2",
    "梯形面积": "S = (a+b)*h/2",
    "勾股定理": "a^2 + b^2 = c^2",
    "长方体体积": "V = a*b*c",
    "球体积": "V = 4/3 * π * r^3",
    "三角恒等式": "sin²α + cos²α = 1",
    "导数公式": "(x^n)' = n*x^(n-1)"
}


class MathFormulaApp:
    def __init__(self, root):
        self.root = root
        self.root.title("数学公式查询工具")
        self.root.geometry("650x500")
        self.root.resizable(False, False)

        # 安全通用字体
        font_title = ("Arial", 16, "bold")
        font_normal = ("Arial", 11)
        font_content = ("Arial", 12)

        # 标题 —— 已去掉 emoji，彻底解决报错！
        title_label = ttk.Label(root, text="常用数学公式查询", font=font_title)
        title_label.pack(pady=10)

        # 搜索栏
        search_frame = ttk.Frame(root)
        search_frame.pack(pady=5, fill=tk.X, padx=20)
        ttk.Label(search_frame, text="搜索公式：", font=font_normal).pack(
            side=tk.LEFT, padx=5)
        self.search_entry = ttk.Entry(search_frame, font=font_normal)
        self.search_entry.pack(side=tk.LEFT, fill=tk.X, expand=True)
        self.search_entry.bind("<KeyRelease>", self.search_formula)

        # 公式列表
        list_label = ttk.Label(root, text="公式列表", font=font_normal)
        list_label.pack(pady=2)
        self.formula_list = tk.Listbox(root, font=font_normal, height=8)
        self.formula_list.pack(fill=tk.X, padx=20, pady=3)
        self.formula_list.bind("<<ListboxSelect>>", self.show_detail)

        # 滚动条
        scrollbar = ttk.Scrollbar(
            self.formula_list, orient=tk.VERTICAL, command=self.formula_list.yview)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        self.formula_list.config(yscrollcommand=scrollbar.set)

        # 详情区域
        detail_label = ttk.Label(root, text="公式详情", font=font_normal)
        detail_label.pack(pady=2)
        self.detail_text = scrolledtext.ScrolledText(
            root, font=font_content, height=6)
        self.detail_text.config(state=tk.DISABLED)
        self.detail_text.pack(fill=tk.BOTH, padx=20, pady=3, expand=True)

        # 按钮
        btn_frame = ttk.Frame(root)
        btn_frame.pack(pady=10)
        ttk.Button(btn_frame, text="复制公式", command=self.copy_formula).pack(
            side=tk.LEFT, padx=10)
        ttk.Button(btn_frame, text="清空", command=self.clear_all).pack(
            side=tk.LEFT, padx=10)

        self.load_all_formulas()

    def load_all_formulas(self):
        self.formula_list.delete(0, tk.END)
        for name in MATH_FORMULAS.keys():
            self.formula_list.insert(tk.END, name)

    def search_formula(self, event):
        key = self.search_entry.get().strip()
        self.formula_list.delete(0, tk.END)
        for name in MATH_FORMULAS.keys():
            if key in name:
                self.formula_list.insert(tk.END, name)

    def show_detail(self, event):
        select = self.formula_list.curselection()
        if select:
            idx = select[0]
            name = self.formula_list.get(idx)
            formula = MATH_FORMULAS[name]
            self.detail_text.config(state=tk.NORMAL)
            self.detail_text.delete(1.0, tk.END)
            self.detail_text.insert(tk.END, f"【{name}】\n\n{formula}")
            self.detail_text.config(state=tk.DISABLED)

    def copy_formula(self):
        select = self.formula_list.curselection()
        if not select:
            messagebox.showwarning("提示", "请先选择公式！")
            return
        name = self.formula_list.get(select[0])
        text = MATH_FORMULAS[name]
        self.root.clipboard_clear()
        self.root.clipboard_append(text)
        messagebox.showinfo("成功", "已复制到剪贴板！")

    def clear_all(self):
        self.search_entry.delete(0, tk.END)
        self.detail_text.config(state=tk.NORMAL)
        self.detail_text.delete(1.0, tk.END)
        self.detail_text.config(state=tk.DISABLED)
        self.load_all_formulas()


if __name__ == "__main__":
    root = tk.Tk()
    app = MathFormulaApp(root)
    root.mainloop()
