import tkinter as tk
from tkinter import ttk, scrolledtext, messagebox
import json
import os
from datetime import datetime

class MathFormulaQueryApp:
    def __init__(self, root):
        self.root = root
        self.root.title("数学公式查询软件")
        self.root.geometry("900x650")
        self.root.configure(bg="#f0f0f0")
        
        # 创建公式数据库
        self.formulas = self.create_formula_database()
        
        # 设置样式
        self.setup_styles()
        
        # 创建界面
        self.create_widgets()
        
        # 加载公式数据
        self.load_formulas()
        
    def setup_styles(self):
        """设置界面样式"""
        self.style = ttk.Style()
        self.style.theme_use('clam')
        
        # 自定义样式
        self.style.configure('Title.TLabel', 
                            font=('Microsoft YaHei', 18, 'bold'),
                            foreground='#2c3e50',
                            background='#f0f0f0')
        
        self.style.configure('Category.TLabel',
                            font=('Microsoft YaHei', 12, 'bold'),
                            foreground='#34495e')
        
        self.style.configure('Formula.TLabel',
                            font=('Consolas', 11),
                            foreground='#2c3e50')
        
    def create_formula_database(self):
        """创建公式数据库"""
        formulas = {
            "代数": [
                {
                    "name": "一元二次方程求根公式",
                    "formula": "x = [-b ± √(b² - 4ac)] / (2a)",
                    "description": "用于求解形如 ax² + bx + c = 0 的方程",
                    "example": "对于方程 2x² + 5x - 3 = 0, a=2, b=5, c=-3"
                },
                {
                    "name": "二项式定理",
                    "formula": "(a + b)ⁿ = Σ[C(n,k) * aⁿ⁻ᵏ * bᵏ], k=0 to n",
                    "description": "二项式的幂展开公式",
                    "example": "(x + y)³ = x³ + 3x²y + 3xy² + y³"
                },
                {
                    "name": "等差数列求和",
                    "formula": "Sₙ = n(a₁ + aₙ)/2 = n[2a₁ + (n-1)d]/2",
                    "description": "等差数列前n项和公式",
                    "example": "数列 1, 3, 5, 7... 前10项和: S₁₀ = 10(1+19)/2 = 100"
                },
                {
                    "name": "等比数列求和",
                    "formula": "Sₙ = a₁(1 - qⁿ)/(1 - q), q≠1",
                    "description": "等比数列前n项和公式",
                    "example": "数列 2, 4, 8, 16... 前5项和: S₅ = 2(1-2⁵)/(1-2) = 62"
                }
            ],
            "几何": [
                {
                    "name": "勾股定理",
                    "formula": "c² = a² + b²",
                    "description": "直角三角形斜边与直角边的关系",
                    "example": "直角边为3和4，斜边为√(3²+4²)=5"
                },
                {
                    "name": "圆的面积",
                    "formula": "S = πr²",
                    "description": "圆的面积计算公式",
                    "example": "半径为5的圆面积: S = π×5² = 25π ≈ 78.54"
                },
                {
                    "name": "圆的周长",
                    "formula": "C = 2πr = πd",
                    "description": "圆的周长计算公式",
                    "example": "半径为5的圆周长: C = 2π×5 = 10π ≈ 31.42"
                },
                {
                    "name": "三角形面积(海伦公式)",
                    "formula": "S = √[p(p-a)(p-b)(p-c)], p=(a+b+c)/2",
                    "description": "已知三边求三角形面积",
                    "example": "三边为3,4,5: p=6, S=√[6×3×2×1]=6"
                }
            ],
            "三角学": [
                {
                    "name": "正弦定理",
                    "formula": "a/sinA = b/sinB = c/sinC = 2R",
                    "description": "三角形边与对角正弦值的关系",
                    "example": ""
                },
                {
                    "name": "余弦定理",
                    "formula": "c² = a² + b² - 2ab cosC",
                    "description": "三角形边与夹角余弦的关系",
                    "example": "已知a=3, b=4, C=60°, 则c²=9+16-24×0.5=13, c=√13≈3.61"
                },
                {
                    "name": "三角函数基本关系",
                    "formula": "sin²θ + cos²θ = 1\ntanθ = sinθ/cosθ",
                    "description": "三角函数基本恒等式",
                    "example": ""
                }
            ],
            "微积分": [
                {
                    "name": "导数基本公式",
                    "formula": "(xⁿ)' = nxⁿ⁻¹\n(sinx)' = cosx\n(eˣ)' = eˣ",
                    "description": "常见函数的导数公式",
                    "example": "(x³)' = 3x², (cosx)' = -sinx"
                },
                {
                    "name": "积分基本公式",
                    "formula": "∫xⁿ dx = xⁿ⁺¹/(n+1) + C, n≠-1\n∫eˣ dx = eˣ + C",
                    "description": "常见函数的积分公式",
                    "example": "∫x² dx = x³/3 + C"
                },
                {
                    "name": "牛顿-莱布尼茨公式",
                    "formula": "∫ₐᵇ f(x)dx = F(b) - F(a)",
                    "description": "定积分计算公式，F(x)是f(x)的原函数",
                    "example": "∫₀¹ x² dx = [x³/3]₀¹ = 1/3"
                }
            ],
            "概率统计": [
                {
                    "name": "排列公式",
                    "formula": "P(n,m) = n!/(n-m)!",
                    "description": "从n个不同元素中取出m个元素的排列数",
                    "example": "P(5,3) = 5!/(5-3)! = 5×4×3 = 60"
                },
                {
                    "name": "组合公式",
                    "formula": "C(n,m) = n!/[m!(n-m)!]",
                    "description": "从n个不同元素中取出m个元素的组合数",
                    "example": "C(5,3) = 5!/(3!2!) = 10"
                },
                {
                    "name": "均值公式",
                    "formula": "x̄ = (Σxᵢ)/n",
                    "description": "算术平均数计算公式",
                    "example": "数据1,2,3,4,5的均值: (1+2+3+4+5)/5 = 3"
                },
                {
                    "name": "标准差公式",
                    "formula": "σ = √[Σ(xᵢ - x̄)²/n]",
                    "description": "总体标准差计算公式",
                    "example": ""
                }
            ]
        }
        return formulas
    
    def create_widgets(self):
        """创建界面组件"""
        # 标题栏
        title_frame = tk.Frame(self.root, bg='#3498db', height=80)
        title_frame.pack(fill='x', pady=(0, 10))
        title_frame.pack_propagate(False)
        
        title_label = tk.Label(title_frame, 
                              text="📐 数学公式查询软件",
                              font=('Microsoft YaHei', 24, 'bold'),
                              fg='white',
                              bg='#3498db')
        title_label.pack(expand=True)
        
        # 搜索区域
        search_frame = tk.Frame(self.root, bg='#f0f0f0')
        search_frame.pack(fill='x', padx=20, pady=(0, 10))
        
        tk.Label(search_frame, 
                text="搜索公式:", 
                font=('Microsoft YaHei', 11),
                bg='#f0f0f0').pack(side='left', padx=(0, 10))
        
        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', 11),
                              width=40,
                              relief='solid',
                              bd=1)
        search_entry.pack(side='left')
        
        # 清除搜索按钮
        clear_btn = tk.Button(search_frame,
                            text="清除搜索",
                            command=self.clear_search,
                            font=('Microsoft YaHei', 10),
                            bg='#e74c3c',
                            fg='white',
                            activebackground='#c0392b',
                            relief='flat',
                            padx=15)
        clear_btn.pack(side='left', padx=(10, 0))
        
        # 主内容区域
        main_frame = tk.Frame(self.root, bg='#f0f0f0')
        main_frame.pack(fill='both', expand=True, padx=20, pady=10)
        
        # 左侧分类列表
        left_frame = tk.Frame(main_frame, bg='white', relief='solid', bd=1)
        left_frame.pack(side='left', fill='y', padx=(0, 10))
        
        tk.Label(left_frame, 
                text="📁 公式分类",
                font=('Microsoft YaHei', 12, 'bold'),
                bg='#2c3e50',
                fg='white',
                padx=20,
                pady=10).pack(fill='x')
        
        # 创建分类列表
        self.category_listbox = tk.Listbox(left_frame,
                                          font=('Microsoft YaHei', 11),
                                          bg='white',
                                          relief='flat',
                                          height=20,
                                          width=15)
        self.category_listbox.pack(fill='both', expand=True, padx=5, pady=5)
        
        # 填充分类
        for category in self.formulas.keys():
            self.category_listbox.insert(tk.END, category)
        
        self.category_listbox.bind('<<ListboxSelect>>', self.on_category_select)
        self.category_listbox.selection_set(0)  # 默认选择第一个分类
        
        # 右侧公式显示区域
        right_frame = tk.Frame(main_frame, bg='white', relief='solid', bd=1)
        right_frame.pack(side='left', fill='both', expand=True)
        
        tk.Label(right_frame,
                text="📄 公式列表",
                font=('Microsoft YaHei', 12, 'bold'),
                bg='#2c3e50',
                fg='white',
                padx=20,
                pady=10).pack(fill='x')
        
        # 公式显示区域
        formula_display_frame = tk.Frame(right_frame, bg='white')
        formula_display_frame.pack(fill='both', expand=True, padx=10, pady=10)
        
        # 创建Treeview显示公式
        columns = ('名称', '公式', '描述')
        self.formula_tree = ttk.Treeview(formula_display_frame,
                                        columns=columns,
                                        show='headings',
                                        height=15)
        
        # 设置列
        for col in columns:
            self.formula_tree.heading(col, text=col)
            self.formula_tree.column(col, width=200 if col == '名称' else 300)
        
        # 添加滚动条
        scrollbar = ttk.Scrollbar(formula_display_frame,
                                orient='vertical',
                                command=self.formula_tree.yview)
        self.formula_tree.configure(yscrollcommand=scrollbar.set)
        
        self.formula_tree.pack(side='left', fill='both', expand=True)
        scrollbar.pack(side='right', fill='y')
        
        # 绑定选择事件
        self.formula_tree.bind('<<TreeviewSelect>>', self.on_formula_select)
        
        # 底部详细信息区域
        detail_frame = tk.Frame(right_frame, bg='#ecf0f1', relief='solid', bd=1)
        detail_frame.pack(fill='x', padx=10, pady=(0, 10))
        
        tk.Label(detail_frame,
                text="📋 公式详情",
                font=('Microsoft YaHei', 11, 'bold'),
                bg='#34495e',
                fg='white',
                padx=15,
                pady=8).pack(fill='x')
        
        # 详细信息文本区域
        self.detail_text = scrolledtext.ScrolledText(detail_frame,
                                                    font=('Microsoft YaHei', 10),
                                                    bg='white',
                                                    height=8,
                                                    wrap='word',
                                                    relief='solid',
                                                    bd=1)
        self.detail_text.pack(fill='both', expand=True, padx=10, pady=10)
        
        # 状态栏
        self.status_var = tk.StringVar()
        self.status_var.set("就绪 | 选择分类查看公式")
        status_bar = tk.Label(self.root,
                             textvariable=self.status_var,
                             font=('Microsoft YaHei', 9),
                             bg='#34495e',
                             fg='white',
                             anchor='w',
                             padx=10)
        status_bar.pack(side='bottom', fill='x')
        
    def load_formulas(self):
        """加载公式到Treeview"""
        # 清除现有数据
        for item in self.formula_tree.get_children():
            self.formula_tree.delete(item)
        
        # 获取当前选择的分类
        selection = self.category_listbox.curselection()
        if not selection:
            return
        
        category = self.category_listbox.get(selection[0])
        
        # 添加公式到Treeview
        for formula in self.formulas.get(category, []):
            self.formula_tree.insert('', 'end', 
                                   values=(formula['name'], 
                                           formula['formula'], 
                                           formula['description']))
        
        self.status_var.set(f"已加载 {len(self.formulas[category])} 个{category}公式")
    
    def on_category_select(self, event):
        """处理分类选择事件"""
        self.load_formulas()
        self.detail_text.delete(1.0, tk.END)
    
    def on_formula_select(self, event):
        """处理公式选择事件"""
        selection = self.formula_tree.selection()
        if not selection:
            return
        
        # 获取选中的公式
        item = self.formula_tree.item(selection[0])
        formula_name = item['values'][0]
        
        # 获取当前分类
        category_selection = self.category_listbox.curselection()
        if not category_selection:
            return
        
        category = self.category_listbox.get(category_selection[0])
        
        # 查找公式详情
        for formula in self.formulas.get(category, []):
            if formula['name'] == formula_name:
                # 显示详细信息
                self.detail_text.delete(1.0, tk.END)
                detail_text = f"公式名称: {formula['name']}\n\n"
                detail_text += f"公式表达式: {formula['formula']}\n\n"
                detail_text += f"公式描述: {formula['description']}\n\n"
                
                if formula['example']:
                    detail_text += f"应用示例: {formula['example']}\n\n"
                
                detail_text += f"所属分类: {category}"
                
                self.detail_text.insert(1.0, detail_text)
                break
    
    def search_formulas(self, *args):
        """搜索公式"""
        search_term = self.search_var.get().strip().lower()
        
        if not search_term:
            # 如果没有搜索词，恢复显示当前分类
            self.load_formulas()
            return
        
        # 清除现有数据
        for item in self.formula_tree.get_children():
            self.formula_tree.delete(item)
        
        # 在所有分类中搜索
        found_count = 0
        for category, formulas in self.formulas.items():
            for formula in formulas:
                # 在名称、公式、描述中搜索
                if (search_term in formula['name'].lower() or 
                    search_term in formula['formula'].lower() or 
                    search_term in formula['description'].lower()):
                    
                    self.formula_tree.insert('', 'end',
                                           values=(formula['name'],
                                                   formula['formula'],
                                                   formula['description']))
                    found_count += 1
        
        self.status_var.set(f"搜索 '{search_term}' 找到 {found_count} 个结果")
        self.detail_text.delete(1.0, tk.END)
    
    def clear_search(self):
        """清除搜索"""
        self.search_var.set("")
        self.load_formulas()

def main():
    """主函数"""
    root = tk.Tk()
    app = MathFormulaQueryApp(root)
    root.mainloop()

if __name__ == "__main__":
    main()