# -*- coding: utf-8 -*-
import tkinter as tk
from tkinter import ttk, scrolledtext


class MathFormulaApp:
    def __init__(self, root):
        self.root = root
        self.root.title("数学公式查询器")
        self.root.geometry("850x650")

        # 设置主题颜色
        self.bg_color = "#f0f8ff"
        self.button_color = "#4a90e2"
        self.text_bg = "#ffffff"

        self.root.configure(bg=self.bg_color)

        # 创建公式数据库
        self.formulas = {
            "代数公式": [
                ("二次方程求根公式", r"x = (-b ± √(b² - 4ac)) / (2a)"),
                ("完全平方公式", r"(a ± b)² = a² ± 2ab + b²"),
                ("平方差公式", r"a² - b² = (a+b)(a-b)"),
                ("立方和公式", r"a³ + b³ = (a+b)(a² - ab + b²)"),
                ("立方差公式", r"a³ - b³ = (a-b)(a² + ab + b²)"),
                ("等差数列求和", r"Sₙ = n(a₁ + aₙ) / 2"),
                ("等比数列求和", r"Sₙ = a₁(1 - qⁿ) / (1 - q)"),
            ],
            "几何公式": [
                ("圆面积公式", r"S = πr²"),
                ("圆周长公式", r"C = 2πr"),
                ("三角形面积公式", r"S = bh/2"),
                ("勾股定理", r"a² + b² = c²"),
                ("球体积公式", r"V = (4/3)πr³"),
                ("圆柱体积公式", r"V = πr²h"),
                ("圆锥体积公式", r"V = (1/3)πr²h"),
                ("长方体表面积", r"S = 2(ab + bc + ac)"),
            ],
            "三角函数": [
                ("正弦定理", r"a/sinA = b/sinB = c/sinC = 2R"),
                ("余弦定理", r"a² = b² + c² - 2bc·cosA"),
                ("正弦和角公式", r"sin(A+B) = sinA·cosB + cosA·sinB"),
                ("余弦和角公式", r"cos(A+B) = cosA·cosB - sinA·sinB"),
                ("二倍角公式-sin", r"sin2A = 2sinA·cosA"),
                ("二倍角公式-cos", r"cos2A = cos²A - sin²A"),
                ("正切公式", r"tan(A+B) = (tanA + tanB)/(1 - tanA·tanB)"),
                ("诱导公式", r"sin(-A) = -sinA, cos(-A) = cosA"),
            ],
            "微积分": [
                ("导数定义", r"f'(x) = lim[h->0] (f(x+h) - f(x))/h"),
                ("幂函数求导", r"(xⁿ)' = nxⁿ⁻¹"),
                ("指数函数求导", r"(eˣ)' = eˣ"),
                ("对数函数求导", r"(lnx)' = 1/x"),
                ("积分基本定理", r"∫[a->b]f(x)dx = F(b) - F(a)"),
                ("分部积分法", r"∫u·dv = uv - ∫v·du"),
                ("换元积分法", r"∫f(g(x))g'(x)dx = ∫f(u)du"),
            ],
            "概率统计": [
                ("期望公式", r"E(X) = Σxᵢpᵢ"),
                ("方差公式", r"Var(X) = E[(X-μ)²]"),
                ("标准差公式", r"σ = √Var(X)"),
                ("排列数公式", r"A(n,m) = n!/(n-m)!"),
                ("组合数公式", r"C(n,m) = n!/[m!(n-m)!]"),
                ("二项式定理", r"(a+b)ⁿ = ΣC(n,k)aⁿ⁻ᵏbᵏ"),
            ]
        }

        self.setup_ui()

    def setup_ui(self):
        # 标题
        title_label = tk.Label(
            self.root,
            text="数学公式查询器",
            font=("Microsoft YaHei", 20, "bold"),
            bg=self.bg_color,
            fg="#2c3e50"
        )
        title_label.pack(pady=20)

        # 副标题
        subtitle_label = tk.Label(
            self.root,
            text="Math Formula Reference",
            font=("Arial", 10),
            bg=self.bg_color,
            fg="#7f8c8d"
        )
        subtitle_label.pack()

        # 搜索框架
        search_frame = tk.Frame(self.root, bg=self.bg_color)
        search_frame.pack(pady=15)

        tk.Label(
            search_frame,
            text="搜索公式:",
            font=("Microsoft YaHei", 12),
            bg=self.bg_color
        ).pack(side=tk.LEFT, padx=5)

        self.search_var = tk.StringVar()
        self.search_var.trace("w", self.search_formulas)
        search_entry = tk.Entry(
            search_frame,
            textvariable=self.search_var,
            font=("Microsoft YaHei", 12),
            width=30
        )
        search_entry.pack(side=tk.LEFT, padx=5)

        # 类别选择框架
        category_frame = tk.Frame(self.root, bg=self.bg_color)
        category_frame.pack(pady=10)

        tk.Label(
            category_frame,
            text="公式类别:",
            font=("Microsoft YaHei", 12),
            bg=self.bg_color
        ).pack(side=tk.LEFT, padx=5)

        self.category_var = tk.StringVar(value="代数公式")
        category_menu = ttk.Combobox(
            category_frame,
            textvariable=self.category_var,
            values=list(self.formulas.keys()),
            state="readonly",
            width=15,
            font=("Microsoft YaHei", 10)
        )
        category_menu.pack(side=tk.LEFT, padx=5)
        category_menu.bind("<<ComboboxSelected>>", self.update_formula_list)

        # 主内容框架
        main_frame = tk.Frame(self.root, bg=self.bg_color)
        main_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=10)

        # 左侧框架 - 公式列表
        left_frame = tk.Frame(main_frame, bg=self.bg_color)
        left_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=(0, 10))

        tk.Label(
            left_frame,
            text="公式列表:",
            font=("Microsoft YaHei", 12, "bold"),
            bg=self.bg_color
        ).pack(anchor=tk.W)

        # 公式列表
        self.formula_listbox = tk.Listbox(
            left_frame,
            font=("Microsoft YaHei", 11),
            bg=self.text_bg,
            selectbackground=self.button_color,
            selectforeground="white",
            height=22,
            relief=tk.FLAT,
            bd=2
        )
        self.formula_listbox.pack(fill=tk.BOTH, expand=True, pady=5)
        self.formula_listbox.bind(
            "<<ListboxSelect>>", self.show_formula_details)

        # 右侧框架 - 公式详情
        right_frame = tk.Frame(main_frame, bg=self.bg_color)
        right_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)

        tk.Label(
            right_frame,
            text="公式详情:",
            font=("Microsoft YaHei", 12, "bold"),
            bg=self.bg_color
        ).pack(anchor=tk.W)

        # 公式详情显示
        self.detail_text = scrolledtext.ScrolledText(
            right_frame,
            font=("Consolas", 13),
            bg=self.text_bg,
            wrap=tk.WORD,
            height=22,
            relief=tk.FLAT,
            bd=2,
            padx=10,
            pady=10
        )
        self.detail_text.pack(fill=tk.BOTH, expand=True, pady=5)

        # 状态栏
        status_frame = tk.Frame(self.root, bg="#34495e")
        status_frame.pack(fill=tk.X, side=tk.BOTTOM)

        self.status_label = tk.Label(
            status_frame,
            text="就绪 | 共收录 34 个常用数学公式",
            font=("Microsoft YaHei", 9),
            bg="#34495e",
            fg="white",
            anchor=tk.W,
            padx=10,
            pady=5
        )
        self.status_label.pack(fill=tk.X)

        # 按钮框架
        button_frame = tk.Frame(self.root, bg=self.bg_color)
        button_frame.pack(pady=15)

        # 复制按钮
        copy_btn = tk.Button(
            button_frame,
            text="复制公式",
            command=self.copy_formula,
            font=("Microsoft YaHei", 11),
            bg="#27ae60",
            fg="white",
            padx=25,
            pady=8,
            cursor="hand2",
            relief=tk.FLAT
        )
        copy_btn.pack(side=tk.LEFT, padx=10)

        # 清空按钮
        clear_btn = tk.Button(
            button_frame,
            text="清空搜索",
            command=self.clear_search,
            font=("Microsoft YaHei", 11),
            bg="#e74c3c",
            fg="white",
            padx=25,
            pady=8,
            cursor="hand2",
            relief=tk.FLAT
        )
        clear_btn.pack(side=tk.LEFT, padx=10)

        # 关于按钮
        about_btn = tk.Button(
            button_frame,
            text="关于",
            command=self.show_about,
            font=("Microsoft YaHei", 11),
            bg=self.button_color,
            fg="white",
            padx=25,
            pady=8,
            cursor="hand2",
            relief=tk.FLAT
        )
        about_btn.pack(side=tk.LEFT, padx=10)

        # 初始化列表
        self.update_formula_list()

    def update_formula_list(self, event=None):
        """更新公式列表"""
        category = self.category_var.get()
        search_text = self.search_var.get().strip().lower()

        self.formula_listbox.delete(0, tk.END)

        if category in self.formulas:
            count = 0
            for name, formula in self.formulas[category]:
                if not search_text or search_text in name.lower() or search_text in formula.lower():
                    self.formula_listbox.insert(tk.END, name)
                    count += 1

            # 更新状态栏
            total = len(self.formulas[category])
            if search_text:
                self.status_label.config(
                    text=f"搜索结果: {count}/{total} 个公式 | 当前类别: {category}")
            else:
                self.status_label.config(text=f"就绪 | {category}: {count} 个公式")

    def search_formulas(self, *args):
        """搜索公式"""
        self.update_formula_list()

    def show_formula_details(self, event):
        """显示公式详情"""
        selection = self.formula_listbox.curselection()
        if not selection:
            return

        formula_name = self.formula_listbox.get(selection[0])
        category = self.category_var.get()

        # 查找对应的公式
        for name, formula in self.formulas[category]:
            if name == formula_name:
                self.detail_text.delete(1.0, tk.END)

                # 格式化显示
                details = f"【{name}】\n"
                details += f"类别: {category}\n"
                details += "=" * 45 + "\n\n"
                details += "公式表达式:\n"
                details += f"  {formula}\n\n"
                details += "=" * 45 + "\n"
                details += "说明: 此公式为{0}中的经典公式".format(category)

                self.detail_text.insert(1.0, details)
                break

    def copy_formula(self):
        """复制当前公式到剪贴板"""
        formula_text = self.detail_text.get(1.0, tk.END).strip()
        if formula_text:
            self.root.clipboard_clear()
            self.root.clipboard_append(formula_text)

            # 更新状态栏
            self.status_label.config(text="公式已复制到剪贴板!")

            # 恢复状态栏
            self.root.after(2000, lambda: self.update_formula_list())

    def clear_search(self):
        """清空搜索"""
        self.search_var.set("")
        self.update_formula_list()
        self.detail_text.delete(1.0, tk.END)
        self.status_label.config(text="就绪 | 共收录 34 个常用数学公式")

    def show_about(self):
        """显示关于信息"""
        about_window = tk.Toplevel(self.root)
        about_window.title("关于")
        about_window.geometry("420x320")
        about_window.configure(bg=self.bg_color)
        about_window.resizable(False, False)
        about_window.transient(self.root)
        about_window.grab_set()

        # 居中显示
        about_window.update_idletasks()
        x = self.root.winfo_x() + (self.root.winfo_width() - 420) // 2
        y = self.root.winfo_y() + (self.root.winfo_height() - 320) // 2
        about_window.geometry(f"+{x}+{y}")

        # 标题
        tk.Label(
            about_window,
            text="数学公式查询器",
            font=("Microsoft YaHei", 18, "bold"),
            bg=self.bg_color,
            fg="#2c3e50"
        ).pack(pady=20)

        # 版本信息
        version_text = """
版本: 1.0
开发者: 潘翊晨

功能特性:
• 五大类常用数学公式
• 实时搜索功能
• 一键复制公式
• 简洁易用的界面

公式类别:
代数 | 几何 | 三角函数 | 微积分 | 概率统计

注意事项:
本工具仅供学习参考使用
公式以文本形式展示，便于复制使用
        """

        tk.Label(
            about_window,
            text=version_text,
            font=("Microsoft YaHei", 10),
            bg=self.bg_color,
            justify=tk.LEFT
        ).pack(pady=10, padx=30)

        # 关闭按钮
        close_btn = tk.Button(
            about_window,
            text="关闭",
            command=about_window.destroy,
            font=("Microsoft YaHei", 10),
            bg=self.button_color,
            fg="white",
            padx=30,
            pady=5,
            relief=tk.FLAT
        )
        close_btn.pack(pady=20)


def main():
    root = tk.Tk()
    app = MathFormulaApp(root)
    root.mainloop()


if __name__ == "__main__":
    main()
