"""
数学公式查询系统
功能：提供常用数学公式的快速查询
"""

import json
import os
import math
from datetime import datetime
import tkinter as tk
from tkinter import ttk, messagebox, scrolledtext
import sympy as sp
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
import numpy as np
import matplotlib

# 设置中文字体
try:
    matplotlib.rcParams['font.sans-serif'] = ['Arial Unicode MS', 'DejaVu Sans', 'Microsoft YaHei']
    matplotlib.rcParams['axes.unicode_minus'] = False
except:
    pass

class MathFormulaQuery:
    def __init__(self):
        """初始化数学公式查询系统"""
        self.formula_file = "math_formulas.json"
        self.init_formula_database()
        
    def init_formula_database(self):
        """初始化公式数据库"""
        default_formulas = {
            "algebra": {
                "name": "代数",
                "formulas": [
                    {
                        "name": "一元二次方程求根公式",
                        "formula": "x = (-b ± √(b² - 4ac)) / 2a",
                        "latex": r"x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}",
                        "description": "解一元二次方程 ax² + bx + c = 0 的公式",
                        "example": "对于方程 2x² + 5x - 3 = 0，其中 a=2, b=5, c=-3",
                        "variables": [
                            {"name": "a", "description": "二次项系数"},
                            {"name": "b", "description": "一次项系数"},
                            {"name": "c", "description": "常数项"}
                        ],
                        "category": "代数"
                    },
                    {
                        "name": "完全平方公式",
                        "formula": "(a + b)² = a² + 2ab + b²",
                        "latex": r"(a + b)^2 = a^2 + 2ab + b^2",
                        "description": "两数和的平方公式",
                        "example": "(3 + 4)² = 3² + 2×3×4 + 4² = 9 + 24 + 16 = 49",
                        "variables": [
                            {"name": "a", "description": "第一个数"},
                            {"name": "b", "description": "第二个数"}
                        ],
                        "category": "代数"
                    },
                    {
                        "name": "完全平方差公式",
                        "formula": "(a - b)² = a² - 2ab + b²",
                        "latex": r"(a - b)^2 = a^2 - 2ab + b^2",
                        "description": "两数差的平方公式",
                        "example": "(5 - 2)² = 5² - 2×5×2 + 2² = 25 - 20 + 4 = 9",
                        "variables": [
                            {"name": "a", "description": "第一个数"},
                            {"name": "b", "description": "第二个数"}
                        ],
                        "category": "代数"
                    },
                    {
                        "name": "平方差公式",
                        "formula": "a² - b² = (a + b)(a - b)",
                        "latex": r"a^2 - b^2 = (a + b)(a - b)",
                        "description": "两数平方差公式",
                        "example": "9 - 4 = 3² - 2² = (3 + 2)(3 - 2) = 5 × 1 = 5",
                        "variables": [
                            {"name": "a", "description": "第一个数"},
                            {"name": "b", "description": "第二个数"}
                        ],
                        "category": "代数"
                    },
                    {
                        "name": "立方和公式",
                        "formula": "a³ + b³ = (a + b)(a² - ab + b²)",
                        "latex": r"a^3 + b^3 = (a + b)(a^2 - ab + b^2)",
                        "description": "两数立方和公式",
                        "example": "8 + 27 = 2³ + 3³ = (2 + 3)(4 - 6 + 9) = 5 × 7 = 35",
                        "variables": [
                            {"name": "a", "description": "第一个数"},
                            {"name": "b", "description": "第二个数"}
                        ],
                        "category": "代数"
                    }
                ]
            },
            "geometry": {
                "name": "几何",
                "formulas": [
                    {
                        "name": "勾股定理",
                        "formula": "a² + b² = c²",
                        "latex": r"a^2 + b^2 = c^2",
                        "description": "直角三角形中，直角边的平方和等于斜边的平方",
                        "example": "如果直角边 a=3, b=4，则斜边 c=√(3²+4²)=√(9+16)=√25=5",
                        "variables": [
                            {"name": "a", "description": "直角边长度"},
                            {"name": "b", "description": "直角边长度"},
                            {"name": "c", "description": "斜边长度"}
                        ],
                        "category": "几何"
                    },
                    {
                        "name": "圆的面积公式",
                        "formula": "S = πr²",
                        "latex": r"S = \pi r^2",
                        "description": "圆的面积计算公式",
                        "example": "如果半径 r=5，则面积 S=π×5²≈3.1416×25≈78.54",
                        "variables": [
                            {"name": "S", "description": "圆的面积"},
                            {"name": "r", "description": "圆的半径"},
                            {"name": "π", "description": "圆周率，约等于3.1416"}
                        ],
                        "category": "几何"
                    },
                    {
                        "name": "圆的周长公式",
                        "formula": "C = 2πr = πd",
                        "latex": r"C = 2\pi r = \pi d",
                        "description": "圆的周长计算公式",
                        "example": "如果半径 r=3，则周长 C=2×π×3≈2×3.1416×3≈18.85",
                        "variables": [
                            {"name": "C", "description": "圆的周长"},
                            {"name": "r", "description": "圆的半径"},
                            {"name": "d", "description": "圆的直径，d=2r"},
                            {"name": "π", "description": "圆周率，约等于3.1416"}
                        ],
                        "category": "几何"
                    },
                    {
                        "name": "三角形面积公式（海伦公式）",
                        "formula": "S = √[p(p-a)(p-b)(p-c)], 其中 p=(a+b+c)/2",
                        "latex": r"S = \sqrt{p(p-a)(p-b)(p-c)}, \quad p = \frac{a+b+c}{2}",
                        "description": "已知三角形三边求面积的公式",
                        "example": "如果三角形三边 a=3, b=4, c=5，则 p=(3+4+5)/2=6，面积 S=√[6×(6-3)×(6-4)×(6-5)]=√[6×3×2×1]=√36=6",
                        "variables": [
                            {"name": "S", "description": "三角形面积"},
                            {"name": "a", "description": "三角形边长"},
                            {"name": "b", "description": "三角形边长"},
                            {"name": "c", "description": "三角形边长"},
                            {"name": "p", "description": "半周长"}
                        ],
                        "category": "几何"
                    },
                    {
                        "name": "长方体体积公式",
                        "formula": "V = lwh",
                        "latex": r"V = lwh",
                        "description": "长方体的体积计算公式",
                        "example": "如果长方体长 l=5, 宽 w=3, 高 h=2，则体积 V=5×3×2=30",
                        "variables": [
                            {"name": "V", "description": "长方体体积"},
                            {"name": "l", "description": "长度"},
                            {"name": "w", "description": "宽度"},
                            {"name": "h", "description": "高度"}
                        ],
                        "category": "几何"
                    }
                ]
            },
            "calculus": {
                "name": "微积分",
                "formulas": [
                    {
                        "name": "导数基本公式（幂函数）",
                        "formula": "d/dx(xⁿ) = nxⁿ⁻¹",
                        "latex": r"\frac{d}{dx}(x^n) = nx^{n-1}",
                        "description": "幂函数的导数公式",
                        "example": "d/dx(x³) = 3x², d/dx(x²) = 2x, d/dx(x) = 1",
                        "variables": [
                            {"name": "x", "description": "自变量"},
                            {"name": "n", "description": "指数，可以是任意实数"}
                        ],
                        "category": "微积分"
                    },
                    {
                        "name": "导数基本公式（指数函数）",
                        "formula": "d/dx(eˣ) = eˣ, d/dx(aˣ) = aˣlna",
                        "latex": r"\frac{d}{dx}(e^x) = e^x, \quad \frac{d}{dx}(a^x) = a^x \ln a",
                        "description": "指数函数的导数公式",
                        "example": "d/dx(eˣ) = eˣ, d/dx(2ˣ) = 2ˣln2",
                        "variables": [
                            {"name": "x", "description": "自变量"},
                            {"name": "a", "description": "底数，a>0 且 a≠1"},
                            {"name": "e", "description": "自然常数，约等于2.71828"}
                        ],
                        "category": "微积分"
                    },
                    {
                        "name": "导数基本公式（对数函数）",
                        "formula": "d/dx(lnx) = 1/x, d/dx(logₐx) = 1/(xlna)",
                        "latex": r"\frac{d}{dx}(\ln x) = \frac{1}{x}, \quad \frac{d}{dx}(\log_a x) = \frac{1}{x \ln a}",
                        "description": "对数函数的导数公式",
                        "example": "d/dx(lnx) = 1/x, d/dx(log₂x) = 1/(xln2)",
                        "variables": [
                            {"name": "x", "description": "自变量，x>0"},
                            {"name": "a", "description": "底数，a>0 且 a≠1"},
                            {"name": "ln", "description": "自然对数"}
                        ],
                        "category": "微积分"
                    },
                    {
                        "name": "不定积分公式（幂函数）",
                        "formula": "∫xⁿ dx = xⁿ⁺¹/(n+1) + C (n≠-1)",
                        "latex": r"\int x^n dx = \frac{x^{n+1}}{n+1} + C \quad (n \neq -1)",
                        "description": "幂函数的不定积分公式",
                        "example": "∫x² dx = x³/3 + C, ∫√x dx = ∫x^(1/2) dx = (2/3)x^(3/2) + C",
                        "variables": [
                            {"name": "x", "description": "自变量"},
                            {"name": "n", "description": "指数，n≠-1"},
                            {"name": "C", "description": "积分常数"}
                        ],
                        "category": "微积分"
                    },
                    {
                        "name": "基本积分公式（指数函数）",
                        "formula": "∫eˣ dx = eˣ + C, ∫aˣ dx = aˣ/lna + C",
                        "latex": r"\int e^x dx = e^x + C, \quad \int a^x dx = \frac{a^x}{\ln a} + C",
                        "description": "指数函数的不定积分公式",
                        "example": "∫eˣ dx = eˣ + C, ∫2ˣ dx = 2ˣ/ln2 + C",
                        "variables": [
                            {"name": "x", "description": "自变量"},
                            {"name": "a", "description": "底数，a>0 且 a≠1"},
                            {"name": "C", "description": "积分常数"}
                        ],
                        "category": "微积分"
                    }
                ]
            },
            "trigonometry": {
                "name": "三角函数",
                "formulas": [
                    {
                        "name": "正弦定理",
                        "formula": "a/sinA = b/sinB = c/sinC = 2R",
                        "latex": r"\frac{a}{\sin A} = \frac{b}{\sin B} = \frac{c}{\sin C} = 2R",
                        "description": "三角形中，各边与其对角的正弦之比相等，且等于外接圆直径",
                        "example": "在三角形ABC中，如果a=3, A=30°, b=4, 则B=arcsin(4×sin30°/3)≈41.8°",
                        "variables": [
                            {"name": "a, b, c", "description": "三角形边长"},
                            {"name": "A, B, C", "description": "三角形内角"},
                            {"name": "R", "description": "三角形外接圆半径"}
                        ],
                        "category": "三角函数"
                    },
                    {
                        "name": "余弦定理",
                        "formula": "a² = b² + c² - 2bc cosA",
                        "latex": r"a^2 = b^2 + c^2 - 2bc \cos A",
                        "description": "三角形中，一边的平方等于另外两边的平方和减去这两边与它们夹角的余弦的两倍积",
                        "example": "在三角形ABC中，如果b=3, c=4, A=60°，则a²=3²+4²-2×3×4×cos60°=9+16-24×0.5=25-12=13，所以a=√13≈3.606",
                        "variables": [
                            {"name": "a, b, c", "description": "三角形边长"},
                            {"name": "A, B, C", "description": "三角形内角"}
                        ],
                        "category": "三角函数"
                    },
                    {
                        "name": "三角函数基本关系",
                        "formula": "sin²θ + cos²θ = 1, tanθ = sinθ/cosθ",
                        "latex": r"\sin^2 \theta + \cos^2 \theta = 1, \quad \tan \theta = \frac{\sin \theta}{\cos \theta}",
                        "description": "三角函数的基本恒等式",
                        "example": "如果 sinθ=0.6, 则 cosθ=√(1-0.6²)=√(1-0.36)=√0.64=0.8, tanθ=0.6/0.8=0.75",
                        "variables": [
                            {"name": "θ", "description": "角度"},
                            {"name": "sin", "description": "正弦函数"},
                            {"name": "cos", "description": "余弦函数"},
                            {"name": "tan", "description": "正切函数"}
                        ],
                        "category": "三角函数"
                    },
                    {
                        "name": "和角公式",
                        "formula": "sin(α±β)=sinαcosβ±cosαsinβ, cos(α±β)=cosαcosβ∓sinαsinβ",
                        "latex": r"\sin(\alpha \pm \beta) = \sin \alpha \cos \beta \pm \cos \alpha \sin \beta",
                        "description": "两角和与差的三角函数公式",
                        "example": "sin(30°+60°)=sin30°cos60°+cos30°sin60°=0.5×0.5+0.866×0.866=0.25+0.75=1",
                        "variables": [
                            {"name": "α, β", "description": "角度"},
                            {"name": "sin", "description": "正弦函数"},
                            {"name": "cos", "description": "余弦函数"}
                        ],
                        "category": "三角函数"
                    },
                    {
                        "name": "二倍角公式",
                        "formula": "sin2θ=2sinθcosθ, cos2θ=cos²θ-sin²θ=2cos²θ-1=1-2sin²θ",
                        "latex": r"\sin 2\theta = 2\sin \theta \cos \theta, \quad \cos 2\theta = \cos^2 \theta - \sin^2 \theta = 2\cos^2 \theta - 1 = 1 - 2\sin^2 \theta",
                        "description": "二倍角的三角函数公式",
                        "example": "如果sinθ=0.6, cosθ=0.8, 则sin2θ=2×0.6×0.8=0.96, cos2θ=0.8²-0.6²=0.64-0.36=0.28",
                        "variables": [
                            {"name": "θ", "description": "角度"},
                            {"name": "sin", "description": "正弦函数"},
                            {"name": "cos", "description": "余弦函数"}
                        ],
                        "category": "三角函数"
                    }
                ]
            },
            "statistics": {
                "name": "统计学",
                "formulas": [
                    {
                        "name": "均值（平均数）",
                        "formula": "x̄ = (x₁ + x₂ + ... + xₙ) / n = Σxᵢ / n",
                        "latex": r"\bar{x} = \frac{x_1 + x_2 + \cdots + x_n}{n} = \frac{\sum_{i=1}^n x_i}{n}",
                        "description": "一组数据的平均值，等于所有数据之和除以数据个数",
                        "example": "数据集 {2, 4, 6, 8, 10} 的均值是 (2+4+6+8+10)/5 = 30/5 = 6",
                        "variables": [
                            {"name": "x̄", "description": "样本均值"},
                            {"name": "xᵢ", "description": "第i个数据点"},
                            {"name": "n", "description": "数据个数"}
                        ],
                        "category": "统计学"
                    },
                    {
                        "name": "方差",
                        "formula": "s² = Σ(xᵢ - x̄)² / (n-1)",
                        "latex": r"s^2 = \frac{\sum_{i=1}^n (x_i - \bar{x})^2}{n-1}",
                        "description": "衡量数据分散程度的指标，样本方差的分母是n-1（无偏估计）",
                        "example": "数据集 {2, 4, 6, 8, 10} 的均值是6，方差为 [(2-6)²+(4-6)²+(6-6)²+(8-6)²+(10-6)²]/(5-1) = (16+4+0+4+16)/4 = 40/4 = 10",
                        "variables": [
                            {"name": "s²", "description": "样本方差"},
                            {"name": "xᵢ", "description": "第i个数据点"},
                            {"name": "x̄", "description": "样本均值"},
                            {"name": "n", "description": "数据个数"}
                        ],
                        "category": "统计学"
                    },
                    {
                        "name": "标准差",
                        "formula": "s = √[Σ(xᵢ - x̄)² / (n-1)]",
                        "latex": r"s = \sqrt{\frac{\sum_{i=1}^n (x_i - \bar{x})^2}{n-1}}",
                        "description": "方差的算术平方根，衡量数据的离散程度",
                        "example": "数据集 {2, 4, 6, 8, 10} 的方差是10，标准差是√10≈3.162",
                        "variables": [
                            {"name": "s", "description": "样本标准差"},
                            {"name": "xᵢ", "description": "第i个数据点"},
                            {"name": "x̄", "description": "样本均值"},
                            {"name": "n", "description": "数据个数"}
                        ],
                        "category": "统计学"
                    }
                ]
            }
        }
        
        # 保存到文件
        with open(self.formula_file, 'w', encoding='utf-8') as f:
            json.dump(default_formulas, f, ensure_ascii=False, indent=2)
        
        return default_formulas
    
    def load_formulas(self):
        """加载公式数据库"""
        if os.path.exists(self.formula_file):
            with open(self.formula_file, 'r', encoding='utf-8') as f:
                return json.load(f)
        else:
            return self.init_formula_database()
    
    def search_formulas(self, keyword, category=None):
        """搜索公式"""
        formulas_data = self.load_formulas()
        results = []
        
        for cat_key, cat_data in formulas_data.items():
            if category and cat_key != category and cat_data["name"] != category:
                continue
                
            for formula in cat_data["formulas"]:
                if (keyword.lower() in formula["name"].lower() or 
                    keyword.lower() in formula["description"].lower() or
                    keyword.lower() in formula.get("example", "").lower() or
                    keyword.lower() in formula["category"].lower()):
                    results.append(formula)
        
        return results
    
    def get_categories(self):
        """获取所有分类"""
        formulas_data = self.load_formulas()
        categories = []
        for cat_key, cat_data in formulas_data.items():
            categories.append({
                "key": cat_key,
                "name": cat_data["name"],
                "count": len(cat_data["formulas"])
            })
        return categories
    
    def get_formula_by_name(self, formula_name):
        """根据名称获取公式"""
        formulas_data = self.load_formulas()
        
        for cat_key, cat_data in formulas_data.items():
            for formula in cat_data["formulas"]:
                if formula["name"] == formula_name:
                    return formula
        
        return None
    
    def calculate_formula(self, formula_name, variables):
        """计算公式（示例功能）"""
        formula = self.get_formula_by_name(formula_name)
        if not formula:
            return None
        
        # 简单的公式计算示例
        if formula_name == "圆的面积公式":
            if 'r' in variables:
                r = float(variables['r'])
                return math.pi * r * r
        elif formula_name == "圆的周长公式":
            if 'r' in variables:
                r = float(variables['r'])
                return 2 * math.pi * r
        elif formula_name == "勾股定理":
            if 'a' in variables and 'b' in variables:
                a = float(variables['a'])
                b = float(variables['b'])
                return math.sqrt(a*a + b*b)
            elif 'a' in variables and 'c' in variables:
                a = float(variables['a'])
                c = float(variables['c'])
                return math.sqrt(c*c - a*a)
            elif 'b' in variables and 'c' in variables:
                b = float(variables['b'])
                c = float(variables['c'])
                return math.sqrt(c*c - b*b)
        elif formula_name == "长方体体积公式":
            if all(k in variables for k in ['l', 'w', 'h']):
                l = float(variables['l'])
                w = float(variables['w'])
                h = float(variables['h'])
                return l * w * h
        elif formula_name == "均值（平均数）":
            if 'values' in variables:
                values = [float(x) for x in variables['values'].split(',')]
                return sum(values) / len(values)
        
        return None
    
    def get_formula_graph(self, formula_name, x_range=(-10, 10), num_points=100):
        """获取公式的图像（如果适用）"""
        formula = self.get_formula_by_name(formula_name)
        if not formula or not hasattr(formula, 'latex'):
            return None
        
        # 尝试解析LaTeX公式并绘图
        try:
            latex_formula = formula.get('latex', '')
            
            # 简单的函数绘图示例
            if formula_name == "导数基本公式（幂函数）":
                x = np.linspace(x_range[0], x_range[1], num_points)
                y = x**2  # 示例：绘制x²
                derivative = 2*x  # 导数：2x
                return {
                    "x": x,
                    "y": y,
                    "derivative": derivative,
                    "title": f"{formula_name}: f(x)=x², f'(x)=2x"
                }
            elif formula_name == "圆的面积公式":
                r_values = np.linspace(0.1, 10, num_points)
                areas = [math.pi * r * r for r in r_values]
                return {
                    "x": r_values,
                    "y": areas,
                    "title": f"{formula_name}: 面积 vs 半径"
                }
            
        except Exception as e:
            print(f"绘图错误: {e}")
            return None

class MathFormulaGUI:
    def __init__(self, root):
        """初始化GUI界面"""
        self.root = root
        self.root.title("数学公式查询系统")
        self.root.geometry("1200x800")
        
        # 初始化公式系统
        self.system = MathFormulaQuery()
        
        # 设置样式
        self.setup_styles()
        
        # 创建主界面
        self.create_main_interface()
        
        # 加载初始数据
        self.load_initial_data()
    
    def setup_styles(self):
        """设置界面样式"""
        style = ttk.Style()
        style.theme_use('clam')
        
        # 自定义颜色
        self.bg_color = "#f8f9fa"
        self.button_color = "#4A90E2"
        self.text_bg = "#ffffff"
        self.header_color = "#2c3e50"
        
        self.root.configure(bg=self.bg_color)
    
    def create_main_interface(self):
        """创建主界面"""
        # 创建顶部框架
        top_frame = tk.Frame(self.root, bg=self.header_color)
        top_frame.pack(fill=tk.X, padx=0, pady=0)
        
        # 标题
        title_label = tk.Label(top_frame, text="数学公式查询系统", 
                             font=("Arial", 24, "bold"), 
                             bg=self.header_color, fg="white")
        title_label.pack(pady=20)
        
        # 主框架
        main_frame = tk.Frame(self.root, bg=self.bg_color)
        main_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=20)
        
        # 左侧搜索面板
        left_frame = tk.Frame(main_frame, bg=self.bg_color)
        left_frame.pack(side=tk.LEFT, fill=tk.Y, padx=(0, 20))
        
        # 右侧显示区域
        right_frame = tk.Frame(main_frame, bg=self.bg_color)
        right_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)
        
        # 创建搜索面板
        self.create_search_panel(left_frame)
        
        # 创建显示区域
        self.create_display_area(right_frame)
    
    def create_search_panel(self, parent):
        """创建搜索面板"""
        search_frame = tk.LabelFrame(parent, text="公式搜索", 
                                   font=("Arial", 12, "bold"),
                                   bg=self.bg_color, padx=10, pady=10)
        search_frame.pack(fill=tk.X, pady=(0, 20))
        
        # 搜索框
        tk.Label(search_frame, text="关键词搜索:", bg=self.bg_color, 
                font=("Arial", 10)).pack(anchor=tk.W, pady=(0, 5))
        
        self.search_var = tk.StringVar()
        search_entry = tk.Entry(search_frame, textvariable=self.search_var, 
                               font=("Arial", 10), width=30)
        search_entry.pack(fill=tk.X, pady=(0, 10))
        
        # 分类选择
        tk.Label(search_frame, text="分类筛选:", bg=self.bg_color, 
                font=("Arial", 10)).pack(anchor=tk.W, pady=(0, 5))
        
        self.category_var = tk.StringVar(value="全部")
        categories = ["全部"] + [cat["name"] for cat in self.system.get_categories()]
        
        category_menu = ttk.Combobox(search_frame, textvariable=self.category_var, 
                                    values=categories, state="readonly", width=28)
        category_menu.pack(fill=tk.X, pady=(0, 10))
        
        # 搜索按钮
        search_button = tk.Button(search_frame, text="搜索公式", 
                                 command=self.perform_search,
                                 bg=self.button_color, fg="white",
                                 font=("Arial", 10, "bold"),
                                 padx=20, pady=8)
        search_button.pack(pady=10)
        
        # 热门公式
        popular_frame = tk.LabelFrame(parent, text="热门公式", 
                                    font=("Arial", 12, "bold"),
                                    bg=self.bg_color, padx=10, pady=10)
        popular_frame.pack(fill=tk.X, pady=(0, 20))
        
        popular_formulas = [
            "勾股定理", "一元二次方程求根公式", "圆的面积公式",
            "导数基本公式（幂函数）", "均值（平均数）", "正弦定理"
        ]
        
        for formula in popular_formulas:
            btn = tk.Button(popular_frame, text=formula, 
                          command=lambda f=formula: self.show_formula_detail(f),
                          bg="#e8f4f8", fg="#2c3e50",
                          font=("Arial", 9),
                          padx=10, pady=5,
                          relief=tk.RAISED, bd=1)
            btn.pack(fill=tk.X, pady=3)
        
        # 公式分类
        category_frame = tk.LabelFrame(parent, text="公式分类", 
                                     font=("Arial", 12, "bold"),
                                     bg=self.bg_color, padx=10, pady=10)
        category_frame.pack(fill=tk.X)
        
        for category in self.system.get_categories():
            btn = tk.Button(category_frame, text=f"{category['name']} ({category['count']})", 
                          command=lambda c=category['name']: self.show_category_formulas(c),
                          bg="#f0f7ff", fg="#2c3e50",
                          font=("Arial", 9),
                          padx=10, pady=5,
                          relief=tk.RAISED, bd=1)
            btn.pack(fill=tk.X, pady=3)
    
    def create_display_area(self, parent):
        """创建显示区域"""
        # 创建笔记本（标签页）
        self.notebook = ttk.Notebook(parent)
        self.notebook.pack(fill=tk.BOTH, expand=True)
        
        # 创建公式列表标签页
        self.list_tab = tk.Frame(self.notebook, bg=self.text_bg)
        self.notebook.add(self.list_tab, text="公式列表")
        
        # 创建滚动文本框用于显示公式列表
        self.list_display = scrolledtext.ScrolledText(self.list_tab, 
                                                     font=("Arial", 10),
                                                     bg=self.text_bg,
                                                     wrap=tk.WORD)
        self.list_display.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
        
        # 创建公式详情标签页
        self.detail_tab = tk.Frame(self.notebook, bg=self.text_bg)
        self.notebook.add(self.detail_tab, text="公式详情")
        
        # 创建滚动文本框用于显示公式详情
        self.detail_display = scrolledtext.ScrolledText(self.detail_tab, 
                                                       font=("Arial", 10),
                                                       bg=self.text_bg,
                                                       wrap=tk.WORD)
        self.detail_display.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
        
        # 创建计算器标签页
        self.calc_tab = tk.Frame(self.notebook, bg=self.text_bg)
        self.notebook.add(self.calc_tab, text="公式计算")
        self.create_calculator_tab()
        
        # 创建图表标签页
        self.plot_tab = tk.Frame(self.notebook, bg=self.text_bg)
        self.notebook.add(self.plot_tab, text="公式图表")
        
        # 初始文本
        welcome_text = "欢迎使用数学公式查询系统！\n"
        welcome_text += "="*50 + "\n\n"
        welcome_text += "请使用左侧搜索功能查找公式，或点击热门公式/分类快速查看。\n\n"
        welcome_text += "系统包含以下类别公式：\n"
        for category in self.system.get_categories():
            welcome_text += f"  • {category['name']}: {category['count']} 个公式\n"
        
        self.list_display.insert(tk.END, welcome_text)
        self.list_display.config(state=tk.DISABLED)
    
    def create_calculator_tab(self):
        """创建计算器标签页"""
        calc_frame = tk.Frame(self.calc_tab, bg=self.bg_color)
        calc_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=20)
        
        # 公式选择
        tk.Label(calc_frame, text="选择公式:", bg=self.bg_color, 
                font=("Arial", 10, "bold")).grid(row=0, column=0, sticky=tk.W, pady=(0, 10))
        
        self.calc_formula_var = tk.StringVar()
        formulas = self.get_all_formula_names()
        self.calc_formula_menu = ttk.Combobox(calc_frame, textvariable=self.calc_formula_var, 
                                             values=formulas, state="readonly", width=40)
        self.calc_formula_menu.grid(row=0, column=1, columnspan=2, sticky=tk.W+tk.E, pady=(0, 10))
        self.calc_formula_menu.bind("<<ComboboxSelected>>", self.on_formula_selected_for_calc)
        
        # 变量输入区域
        self.calc_vars_frame = tk.Frame(calc_frame, bg=self.bg_color)
        self.calc_vars_frame.grid(row=1, column=0, columnspan=3, sticky=tk.W+tk.E, pady=(0, 20))
        
        # 结果区域
        tk.Label(calc_frame, text="计算结果:", bg=self.bg_color, 
                font=("Arial", 10, "bold")).grid(row=2, column=0, sticky=tk.W, pady=(0, 10))
        
        self.result_text = scrolledtext.ScrolledText(calc_frame, height=8,
                                                    font=("Arial", 10),
                                                    bg=self.text_bg)
        self.result_text.grid(row=3, column=0, columnspan=3, sticky=tk.W+tk.E+tk.N+tk.S, pady=(0, 20))
        
        # 按钮
        button_frame = tk.Frame(calc_frame, bg=self.bg_color)
        button_frame.grid(row=4, column=0, columnspan=3, pady=10)
        
        tk.Button(button_frame, text="计算", command=self.perform_calculation,
                 bg=self.button_color, fg="white",
                 font=("Arial", 10, "bold"),
                 padx=20, pady=5).pack(side=tk.LEFT, padx=5)
        
        tk.Button(button_frame, text="清除", command=self.clear_calculator,
                 bg="#95a5a6", fg="white",
                 font=("Arial", 10),
                 padx=20, pady=5).pack(side=tk.LEFT, padx=5)
        
        # 配置网格权重
        calc_frame.grid_columnconfigure(1, weight=1)
        calc_frame.grid_rowconfigure(3, weight=1)
    
    def load_initial_data(self):
        """加载初始数据"""
        categories = self.system.get_categories()
        
        # 显示所有公式
        self.show_all_formulas()
    
    def show_all_formulas(self):
        """显示所有公式"""
        formulas_data = self.system.load_formulas()
        self.list_display.config(state=tk.NORMAL)
        self.list_display.delete(1.0, tk.END)
        
        for cat_key, cat_data in formulas_data.items():
            self.list_display.insert(tk.END, f"\n{cat_data['name']} ({len(cat_data['formulas'])})\n")
            self.list_display.insert(tk.END, "="*50 + "\n")
            
            for i, formula in enumerate(cat_data["formulas"], 1):
                self.list_display.insert(tk.END, f"{i}. {formula['name']}\n")
                self.list_display.insert(tk.END, f"   公式: {formula['formula']}\n")
                self.list_display.insert(tk.END, f"   描述: {formula['description']}\n")
                
                # 添加点击事件
                self.list_display.tag_add(f"formula_{i}", f"{self.list_display.index('end-2l')}", 
                                         f"{self.list_display.index('end-1c')}")
                self.list_display.tag_config(f"formula_{i}", foreground="blue", underline=1)
                
                # 绑定点击事件
                def make_lambda(formula_name=formula['name']):
                    return lambda e: self.show_formula_detail(formula_name)
                
                self.list_display.tag_bind(f"formula_{i}", "<Button-1>", make_lambda())
                
                self.list_display.insert(tk.END, "-"*40 + "\n")
        
        self.list_display.config(state=tk.DISABLED)
    
    def perform_search(self):
        """执行搜索"""
        keyword = self.search_var.get().strip()
        category = self.category_var.get()
        
        if not keyword and category == "全部":
            self.show_all_formulas()
            return
        
        results = self.system.search_formulas(keyword, None if category == "全部" else category)
        
        self.list_display.config(state=tk.NORMAL)
        self.list_display.delete(1.0, tk.END)
        
        if not results:
            self.list_display.insert(tk.END, f"没有找到包含 '{keyword}' 的公式")
            if category != "全部":
                self.list_display.insert(tk.END, f" (分类: {category})")
            self.list_display.insert(tk.END, "\n")
        else:
            self.list_display.insert(tk.END, f"找到 {len(results)} 个相关公式")
            if category != "全部":
                self.list_display.insert(tk.END, f" (分类: {category})")
            self.list_display.insert(tk.END, "\n")
            self.list_display.insert(tk.END, "="*60 + "\n\n")
            
            for i, formula in enumerate(results, 1):
                self.list_display.insert(tk.END, f"{i}. {formula['name']}\n")
                self.list_display.insert(tk.END, f"   公式: {formula['formula']}\n")
                self.list_display.insert(tk.END, f"   描述: {formula['description']}\n")
                self.list_display.insert(tk.END, f"   分类: {formula['category']}\n")
                
                # 添加点击事件
                self.list_display.tag_add(f"result_{i}", f"{self.list_display.index('end-3l')}", 
                                         f"{self.list_display.index('end-2l lineend')}")
                self.list_display.tag_config(f"result_{i}", foreground="blue", underline=1)
                
                # 绑定点击事件
                def make_lambda(formula_name=formula['name']):
                    return lambda e: self.show_formula_detail(formula_name)
                
                self.list_display.tag_bind(f"result_{i}", "<Button-1>", make_lambda())
                
                self.list_display.insert(tk.END, "-"*40 + "\n")
        
        self.list_display.config(state=tk.DISABLED)
    
    def show_formula_detail(self, formula_name):
        """显示公式详情"""
        formula = self.system.get_formula_by_name(formula_name)
        if not formula:
            messagebox.showerror("错误", f"未找到公式: {formula_name}")
            return
        
        self.notebook.select(1)  # 切换到详情标签页
        self.detail_display.config(state=tk.NORMAL)
        self.detail_display.delete(1.0, tk.END)
        
        # 显示公式详情
        self.detail_display.insert(tk.END, f"公式名称: {formula['name']}\n")
        self.detail_display.insert(tk.END, "="*50 + "\n\n")
        self.detail_display.insert(tk.END, f"公式: {formula['formula']}\n\n")
        
        if 'latex' in formula:
            self.detail_display.insert(tk.END, f"LaTeX格式: {formula['latex']}\n\n")
        
        self.detail_display.insert(tk.END, f"描述: {formula['description']}\n\n")
        
        if 'example' in formula and formula['example']:
            self.detail_display.insert(tk.END, f"示例: {formula['example']}\n\n")
        
        if 'variables' in formula and formula['variables']:
            self.detail_display.insert(tk.END, "变量说明:\n")
            for var in formula['variables']:
                self.detail_display.insert(tk.END, f"  {var['name']}: {var['description']}\n")
            self.detail_display.insert(tk.END, "\n")
        
        self.detail_display.insert(tk.END, f"分类: {formula['category']}\n")
        
        self.detail_display.config(state=tk.DISABLED)
        
        # 更新计算器中的公式选择
        self.calc_formula_var.set(formula_name)
        self.on_formula_selected_for_calc()
    
    def show_category_formulas(self, category_name):
        """显示分类下的所有公式"""
        self.category_var.set(category_name)
        self.perform_search()
    
    def get_all_formula_names(self):
        """获取所有公式名称"""
        formulas_data = self.system.load_formulas()
        formula_names = []
        
        for cat_key, cat_data in formulas_data.items():
            for formula in cat_data["formulas"]:
                formula_names.append(formula['name'])
        
        return sorted(formula_names)
    
    def on_formula_selected_for_calc(self, event=None):
        """计算器公式选择事件"""
        formula_name = self.calc_formula_var.get()
        if not formula_name:
            return
        
        formula = self.system.get_formula_by_name(formula_name)
        if not formula:
            return
        
        # 清除现有变量输入框
        for widget in self.calc_vars_frame.winfo_children():
            widget.destroy()
        
        # 创建新的变量输入框
        row = 0
        if 'variables' in formula:
            tk.Label(self.calc_vars_frame, text="输入变量值:", bg=self.bg_color, 
                    font=("Arial", 10, "bold")).grid(row=row, column=0, sticky=tk.W, pady=(0, 10))
            row += 1
            
            self.calc_vars_entries = {}
            for var in formula['variables']:
                tk.Label(self.calc_vars_frame, text=f"{var['name']} ({var['description']}):", 
                        bg=self.bg_color, font=("Arial", 9)).grid(row=row, column=0, sticky=tk.W, pady=2)
                
                entry = tk.Entry(self.calc_vars_frame, font=("Arial", 9), width=20)
                entry.grid(row=row, column=1, sticky=tk.W, pady=2, padx=(10, 0))
                
                self.calc_vars_entries[var['name']] = entry
                row += 1
    
    def perform_calculation(self):
        """执行计算"""
        formula_name = self.calc_formula_var.get()
        if not formula_name:
            messagebox.showerror("错误", "请选择一个公式！")
            return
        
        formula = self.system.get_formula_by_name(formula_name)
        if not formula:
            messagebox.showerror("错误", f"未找到公式: {formula_name}")
            return
        
        # 收集变量值
        variables = {}
        for var_name, entry in self.calc_vars_entries.items():
            value = entry.get().strip()
            if not value:
                messagebox.showerror("错误", f"请输入变量 {var_name} 的值！")
                return
            try:
                # 尝试解析表达式
                variables[var_name] = str(value)  # 保持字符串，让calculate_formula处理
            except:
                messagebox.showerror("错误", f"变量 {var_name} 的值格式错误！")
                return
        
        # 执行计算
        try:
            result = self.system.calculate_formula(formula_name, variables)
            
            self.result_text.config(state=tk.NORMAL)
            self.result_text.delete(1.0, tk.END)
            
            if result is not None:
                self.result_text.insert(tk.END, f"公式: {formula_name}\n")
                self.result_text.insert(tk.END, f"表达式: {formula['formula']}\n")
                self.result_text.insert(tk.END, "="*40 + "\n")
                self.result_text.insert(tk.END, f"输入值:\n")
                for var_name, value in variables.items():
                    self.result_text.insert(tk.END, f"  {var_name} = {value}\n")
                self.result_text.insert(tk.END, "-"*40 + "\n")
                self.result_text.insert(tk.END, f"计算结果: {result}\n")
                self.result_text.insert(tk.END, "-"*40 + "\n")
                
                # 显示计算过程
                if formula_name == "圆的面积公式":
                    r = float(variables.get('r', 0))
                    self.result_text.insert(tk.END, f"计算过程:\n")
                    self.result_text.insert(tk.END, f"  S = π × r²\n")
                    self.result_text.insert(tk.END, f"    = 3.14159 × ({r})²\n")
                    self.result_text.insert(tk.END, f"    = 3.14159 × {r*r}\n")
                    self.result_text.insert(tk.END, f"    = {result}\n")
                elif formula_name == "勾股定理":
                    if 'a' in variables and 'b' in variables:
                        a = float(variables['a'])
                        b = float(variables['b'])
                        self.result_text.insert(tk.END, f"计算过程:\n")
                        self.result_text.insert(tk.END, f"  c = √(a² + b²)\n")
                        self.result_text.insert(tk.END, f"    = √({a}² + {b}²)\n")
                        self.result_text.insert(tk.END, f"    = √({a*a} + {b*b})\n")
                        self.result_text.insert(tk.END, f"    = √({a*a + b*b})\n")
                        self.result_text.insert(tk.END, f"    = {result}\n")
            else:
                self.result_text.insert(tk.END, f"该公式 '{formula_name}' 目前不支持自动计算\n")
                self.result_text.insert(tk.END, f"公式: {formula['formula']}\n")
                self.result_text.insert(tk.END, f"描述: {formula['description']}\n")
                if 'example' in formula:
                    self.result_text.insert(tk.END, f"示例: {formula['example']}\n")
            
            self.result_text.config(state=tk.DISABLED)
            
        except Exception as e:
            messagebox.showerror("计算错误", f"计算过程中发生错误:\n{str(e)}")
    
    def clear_calculator(self):
        """清除计算器"""
        self.calc_formula_var.set("")
        self.result_text.config(state=tk.NORMAL)
        self.result_text.delete(1.0, tk.END)
        self.result_text.config(state=tk.DISABLED)
        
        # 清除变量输入框
        for widget in self.calc_vars_frame.winfo_children():
            widget.destroy()
    
    def show_plot(self, formula_name):
        """显示公式图表"""
        if not formula_name:
            return
        
        graph_data = self.system.get_formula_graph(formula_name)
        if not graph_data:
            messagebox.showinfo("提示", f"公式 '{formula_name}' 暂无图表数据")
            return
        
        self.notebook.select(3)  # 切换到图表标签页
        
        # 清除现有图表
        for widget in self.plot_tab.winfo_children():
            widget.destroy()
        
        # 创建新图表
        fig, ax = plt.subplots(figsize=(10, 6))
        
        if formula_name == "导数基本公式（幂函数）":
            ax.plot(graph_data["x"], graph_data["y"], 'b-', label='f(x)=x²', linewidth=2)
            ax.plot(graph_data["x"], graph_data["derivative"], 'r--', label="f'(x)=2x", linewidth=2)
            ax.set_xlabel('x')
            ax.set_ylabel('y')
            ax.set_title(graph_data["title"])
            ax.legend()
            ax.grid(True, alpha=0.3)
            
        elif formula_name == "圆的面积公式":
            ax.plot(graph_data["x"], graph_data["y"], 'g-', linewidth=2)
            ax.set_xlabel('半径 (r)')
            ax.set_ylabel('面积 (S)')
            ax.set_title(graph_data["title"])
            ax.grid(True, alpha=0.3)
        
        plt.tight_layout()
        
        # 在tkinter中显示图表
        canvas = FigureCanvasTkAgg(fig, master=self.plot_tab)
        canvas.draw()
        canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True)
        
        # 添加工具栏
        toolbar = NavigationToolbar2Tk(canvas, self.plot_tab)
        toolbar.update()
        toolbar.pack(side=tk.BOTTOM, fill=tk.X)

def main():
    """主程序"""
    root = tk.Tk()
    app = MathFormulaGUI(root)
    root.mainloop()

if __name__ == "__main__":
    main()
