import tkinter as tk
from tkinter import messagebox, scrolledtext

# ===================== 1-8年级纯数学公式库（内存运行，无本地文件） =====================
MATH_FORMULAS = {
    "一年级": {
        "数的组成公式": "10个1 = 1个十；10个十 = 1个百"
    },
    "二年级": {
        "乘法各部分关系": "因数 × 因数 = 积",
        "除法各部分关系": "被除数 ÷ 除数 = 商；商 × 除数 = 被除数",
        "长度单位换算": "1m=10dm；1dm=10cm；1cm=10mm",
        "人民币单位换算": "1元=10角；1角=10分；1元=100分"
    },
    "三年级": {
        "长方形周长公式": "C=(a+b)×2 （a=长，b=宽）",
        "正方形周长公式": "C=4a （a=边长）",
        "长方形面积公式": "S=a×b （a=长，b=宽）",
        "正方形面积公式": "S=a² （a=边长）",
        "质量单位换算": "1t=1000kg；1kg=1000g",
        "时间单位换算": "1时=60分；1分=60秒；1时=3600秒"
    },
    "四年级": {
        "四则运算核心关系": "和=加数+加数；差=被减数-减数",
        "平行四边形面积公式": "S=a×h （a=底，h=高）",
        "三角形面积公式": "S=a×h÷2 （a=底，h=高）",
        "梯形面积公式": "S=(a+b)×h÷2 （a=上底，b=下底，h=高）",
        "路程公式": "路程=速度×时间；速度=路程÷时间；时间=路程÷速度",
        "工作总量公式": "工作总量=工作效率×工作时间；工作效率=工作总量÷工作时间"
    },
    "五年级": {
        "长方体棱长和公式": "L=(a+b+h)×4 （a=长，b=宽，h=高）",
        "正方体棱长和公式": "L=12a （a=棱长）",
        "长方体表面积公式": "S=(ab+ah+bh)×2",
        "正方体表面积公式": "S=6a² （a=棱长）",
        "长方体体积公式": "V=abh 或 V=S底×h",
        "正方体体积公式": "V=a³ 或 V=S底×h",
        "体积单位换算": "1m³=1000dm³；1dm³=1000cm³",
        "容积单位换算": "1L=1dm³；1mL=1cm³；1L=1000mL",
        "分数基本性质": "a/b = (a×c)/(b×c) = (a÷c)/(b÷c)（b≠0，c≠0）"
    },
    "六年级": {
        "圆的周长公式": "C=2πr 或 C=πd （r=半径，d=直径，π≈3.14）",
        "圆的面积公式": "S=πr² 或 S=π(d/2)²",
        "圆环面积公式": "S=π(R²-r²) （R=外圆半径，r=内圆半径）",
        "圆柱侧面积公式": "S侧=Ch=2πrh=πdh",
        "圆柱表面积公式": "S表=2πrh+2πr²",
        "圆柱体积公式": "V=πr²h=S底×h",
        "圆锥体积公式": "V=1/3πr²h=1/3S底×h",
        "比例基本性质": "若a:b=c:d，则ad=bc",
        "折扣公式": "现价=原价×折扣；原价=现价÷折扣",
        "利息公式": "利息=本金×利率×存期"
    },
    "七年级（初一）": {
        "有理数加法法则": "同号相加取同号，异号相加取大值符号",
        "有理数乘法法则": "同号得正，异号得负，绝对值相乘",
        "合并同类项": "ax±bx=(a±b)x",
        "去括号法则": "a+(b+c)=a+b+c；a-(b+c)=a-b-c",
        "一元一次方程标准式": "ax+b=0（a≠0，a、b为常数）",
        "余角公式": "∠A+∠B=90° → ∠A与∠B互余",
        "补角公式": "∠A+∠B=180° → ∠A与∠B互补"
    },
    "八年级（初二）": {
        "平方根定义": "若x²=a（a≥0），则x=±√a",
        "算术平方根定义": "若x²=a（a≥0，x≥0），则x=√a",
        "立方根定义": "若x³=a，则x=³√a",
        "勾股定理": "a²+b²=c²（直角三角形，c为斜边）",
        "勾股定理逆定理": "若a²+b²=c²，则△ABC为直角三角形",
        "菱形面积公式": "S=1/2×d1×d2（d1、d2为对角线）",
        "一次函数解析式": "y=kx+b（k≠0，k、b为常数）",
        "正比例函数解析式": "y=kx（k≠0，k为常数）"
    }
}
# 提取年级列表作为目录
GRADE_LIST = list(MATH_FORMULAS.keys())

# ===================== GUI界面（带左侧目录跳转，无特殊字符） =====================


class FormulaQueryApp:
    def __init__(self, root):
        # 主窗口基础设置
        self.root = root
        self.root.title("1-8年级数学公式查询器（带目录跳转）")
        self.root.geometry("950x700")
        self.root.configure(bg="#f0f0f0")
        self.root.resizable(True, True)

        # 加载公式库
        self.formulas = MATH_FORMULAS

        # 初始化界面组件
        self._create_ui()

    def _create_ui(self):
        # 整体布局：左侧目录栏（宽200）+ 右侧主内容区（剩余宽度）
        # 1. 左侧年级目录栏
        dir_frame = tk.Frame(self.root, bg="#e0e0e0",
                             width=200, relief=tk.RAISED, bd=2)
        dir_frame.pack(side=tk.LEFT, fill=tk.Y, padx=5, pady=5)
        dir_frame.pack_propagate(False)  # 固定宽度

        # 目录标题
        dir_title = tk.Label(dir_frame, text="年级目录", font=(
            "微软雅黑", 14, "bold"), bg="#e0e0e0", fg="#333333")
        dir_title.pack(pady=10)

        # 生成年级目录按钮（点击跳转）
        for grade in GRADE_LIST:
            btn = tk.Button(
                dir_frame, text=grade, font=("微软雅黑", 12),
                bg="#ffffff", fg="#000000", relief=tk.RAISED, bd=1,
                command=lambda g=grade: self.jump_to_grade(g)
            )
            btn.pack(fill=tk.X, padx=10, pady=5)

        # 2. 右侧主内容区
        main_frame = tk.Frame(self.root, bg="#f0f0f0")
        main_frame.pack(side=tk.RIGHT, fill=tk.BOTH,
                        expand=True, padx=5, pady=5)

        # 搜索栏
        search_frame = tk.Frame(main_frame, bg="#f0f0f0")
        search_frame.pack(fill=tk.X, pady=5)

        tk.Label(search_frame, text="关键词搜索：", font=("微软雅黑", 12),
                 bg="#f0f0f0").pack(side=tk.LEFT, padx=5)
        self.keyword_entry = tk.Entry(
            search_frame, font=("微软雅黑", 12), width=30)
        self.keyword_entry.pack(side=tk.LEFT, padx=5)

        tk.Button(
            search_frame, text="搜索公式", font=("微软雅黑", 12), bg="#4CAF50", fg="white",
            relief=tk.RAISED, bd=1, command=self.query_keyword
        ).pack(side=tk.LEFT, padx=10)

        tk.Button(
            search_frame, text="清空结果", font=("微软雅黑", 12), bg="#f44336", fg="white",
            relief=tk.RAISED, bd=1, command=self.clear_result
        ).pack(side=tk.LEFT, padx=5)

        # 公式结果显示区
        result_title = tk.Label(main_frame, text="公式查询结果（可选中复制）", font=(
            "微软雅黑", 14, "bold"), bg="#f0f0f0")
        result_title.pack(anchor=tk.W, pady=5)

        self.result_text = scrolledtext.ScrolledText(
            main_frame, font=("微软雅黑", 11), bg="white", fg="#333333",
            relief=tk.SOLID, bd=1, wrap=tk.WORD
        )
        self.result_text.pack(fill=tk.BOTH, expand=True, padx=0, pady=5)
        # 允许鼠标选中复制
        self.result_text.bind("<1>", lambda e: self.result_text.focus_set())

        # 初始显示欢迎语（移除特殊字符）
        self.result_text.insert(
            tk.END, "点击左侧【年级目录】可直接跳转显示对应公式\n在上方输入关键词可跨年级搜索公式（如：面积、勾股定理）")

    def jump_to_grade(self, grade):
        """目录点击跳转：显示对应年级公式"""
        self.clear_result()
        grade_formulas = self.formulas.get(grade, {})
        # 格式化显示公式（移除特殊字符）
        content = "========== " + grade + " 核心数学公式 ==========\n\n"
        for idx, (name, formula) in enumerate(grade_formulas.items(), 1):
            content += str(idx) + ". 【" + name + "】\n" + formula + "\n\n"
        self.result_text.insert(tk.END, content)

    def query_keyword(self):
        """关键词搜索公式（移除特殊字符）"""
        self.clear_result()
        keyword = self.keyword_entry.get().strip()
        if not keyword:
            messagebox.showwarning("提示", "请输入搜索关键词！（如：面积、体积、勾股定理）")
            return
        # 跨年级匹配关键词
        results = []
        for grade, formulas in self.formulas.items():
            for name, formula in formulas.items():
                if keyword in name or keyword in formula:
                    results.append((grade, name, formula))
        # 显示结果
        if not results:
            self.result_text.insert(tk.END, "未找到包含「" + keyword + "」的公式")
            return
        content = "========== 含「" + keyword + "」的公式（共" + \
            str(len(results)) + "条） ==========\n\n"
        for idx, (grade, name, formula) in enumerate(results, 1):
            content += str(idx) + ". 【" + grade + "】-【" + \
                name + "】\n" + formula + "\n\n"
        self.result_text.insert(tk.END, content)

    def clear_result(self):
        """清空结果框和搜索框"""
        self.result_text.delete(1.0, tk.END)
        self.keyword_entry.delete(0, tk.END)


# ===================== 程序入口（100%可运行） =====================
if __name__ == "__main__":
    root = tk.Tk()
    app = FormulaQueryApp(root)
    root.mainloop()
