import tkinter as tk
from tkinter import ttk, scrolledtext, messagebox

# 数学公式库（可自行扩展）
MATH_FORMULAS = {
    # 代数公式
    "完全平方公式": "(a+b)² = a² + 2ab + b²\n(a-b)² = a² - 2ab + b²",
    "平方差公式": "a² - b² = (a+b)(a-b)",
    "一元二次方程求根公式": "ax²+bx+c=0\nx = [-b±√(b²-4ac)]/(2a)",
    "等差数列求和": "Sₙ = n(a₁+aₙ)/2 = na₁ + n(n-1)d/2",
    "等比数列求和": "Sₙ = a₁(1-qⁿ)/(1-q) (q≠1)",

    # 几何公式
    "圆周长": "C = 2πr",
    "圆面积": "S = πr²",
    "三角形面积": "S = ah/2",
    "矩形面积": "S = ab",
    "梯形面积": "S = (a+b)h/2",
    "球体体积": "V = (4/3)πr³",
    "长方体体积": "V = abc",

    # 三角函数
    "正弦定理": "a/sinA = b/sinB = c/sinC = 2R",
    "余弦定理": "a² = b²+c²-2bc·cosA",
    "sin²+cos²=1": "sin²α + cos²α = 1",

    # 微积分
    "导数基本公式": "(xⁿ)' = nxⁿ⁻¹\n(sinx)' = cosx\n(eˣ)' = eˣ",
    "积分基本公式": "∫xⁿdx = xⁿ⁺¹/(n+1) + C\n∫sinxdx = -cosx + C"
}


class MathFormulaApp:
    def __init__(self, root):
        self.root = root
        self.root.title("数学公式查询工具 V1.0")
        self.root.geometry("650x500")
        self.root.resizable(False, False)

        # 顶部搜索框
        self.create_search_frame()

        # 公式列表
        self.create_list_frame()

        # 公式展示区域
        self.create_display_frame()

        # 绑定事件
        self.listbox.bind("<<ListboxSelect>>", self.show_formula)
        self.search_entry.bind("<KeyRelease>", self.search_formula)

        # 加载所有公式
        self.load_all_formulas()

    def create_search_frame(self):
        """创建搜索框区域"""
        search_frame = ttk.Frame(self.root, padding=10)
        search_frame.pack(fill=tk.X)

        ttk.Label(search_frame, text="搜索公式：", font=(
            "微软雅黑", 11)).pack(side=tk.LEFT, padx=5)
        self.search_entry = ttk.Entry(
            search_frame, font=("微软雅黑", 12), width=30)
        self.search_entry.pack(side=tk.LEFT, padx=5, fill=tk.X, expand=True)
        self.search_entry.focus()

        ttk.Button(search_frame, text="复制公式", command=self.copy_formula).pack(
            side=tk.RIGHT, padx=5)

    def create_list_frame(self):
        """创建公式列表区域"""
        list_frame = ttk.Frame(self.root, padding=10)
        list_frame.pack(fill=tk.BOTH, expand=True)

        ttk.Label(list_frame, text="公式列表", font=(
            "微软雅黑", 11, "bold")).pack(anchor=tk.W)

        # 滚动条 + 列表框
        scrollbar = ttk.Scrollbar(list_frame)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

        self.listbox = tk.Listbox(list_frame, font=(
            "微软雅黑", 11), yscrollcommand=scrollbar.set, height=8)
        self.listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        scrollbar.config(command=self.listbox.yview)

    def create_display_frame(self):
        """创建公式展示区域"""
        display_frame = ttk.Frame(self.root, padding=10)
        display_frame.pack(fill=tk.BOTH, expand=True)

        ttk.Label(display_frame, text="公式内容", font=(
            "微软雅黑", 11, "bold")).pack(anchor=tk.W)
        self.display_text = scrolledtext.ScrolledText(
            display_frame, font=("微软雅黑", 13), height=8, state=tk.DISABLED)
        self.display_text.pack(fill=tk.BOTH, expand=True)

    def load_all_formulas(self):
        """加载所有公式到列表"""
        self.listbox.delete(0, tk.END)
        for name in MATH_FORMULAS.keys():
            self.listbox.insert(tk.END, name)

    def search_formula(self, event):
        """实时搜索公式"""
        keyword = self.search_entry.get().strip()
        if not keyword:
            self.load_all_formulas()
            return

        self.listbox.delete(0, tk.END)
        for name in MATH_FORMULAS.keys():
            if keyword in name:
                self.listbox.insert(tk.END, name)

    def show_formula(self, event):
        """显示选中的公式"""
        selected = self.listbox.curselection()
        if not selected:
            return

        formula_name = self.listbox.get(selected[0])
        formula_content = MATH_FORMULAS[formula_name]

        # 启用编辑、清空、写入、禁用编辑
        self.display_text.config(state=tk.NORMAL)
        self.display_text.delete(1.0, tk.END)
        self.display_text.insert(
            tk.END, f"【{formula_name}】\n\n{formula_content}")
        self.display_text.config(state=tk.DISABLED)

    def copy_formula(self):
        """复制当前显示的公式"""
        content = self.display_text.get(1.0, tk.END).strip()
        if not content:
            messagebox.showwarning("提示", "请先选择一个公式！")
            return

        self.root.clipboard_clear()
        self.root.clipboard_append(content)
        messagebox.showinfo("成功", "公式已复制到剪贴板！")


if __name__ == "__main__":
    root = tk.Tk()
    app = MathFormulaApp(root)
    root.mainloop()
