吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 650|回复: 10
上一主题 下一主题
收起左侧

[原创工具] Python开发的初中数学学习小帮手

  [复制链接]
跳转到指定楼层
楼主
xhlbudd 发表于 2026-4-24 23:57 回帖奖励
最近在教舅舅家上初二的儿子Python编程,前几天在吾爱分享了Python开发的英文打字小游戏,很荣幸得到斑竹认可和站友们的支持:
Python开发的英文打字小游戏 - 吾爱破解 - 52pojie.cn

因为编程和数学密不可分,今天用Python开发了一个初中数学学习小帮手,包含最大公约数、最小公倍数、素数、三角函数计算,一元二次方程求解,还有阶乘、排列组合、对数、平均值、方差的计算,界面清爽,还带动听的背景音乐,下载链接如下(带exe格式的游戏,源代码和音乐素材),欢迎大家体验(由于编译之后的程序有88M,所以双击exe之后请等待6-8秒,即可启动):

通过百度网盘分享的文件:202604 初中数学小帮手
链接: https://pan.baidu.com/s/1CWxXSiyMg-CcV2I9NtcAZQ?pwd=52pj 提取码: 52pj

同时把源代码分享如下,请大家多多指教:
[Python] 纯文本查看 复制代码
import tkinter as tk
from tkinter import ttk, scrolledtext, messagebox
import math
import sympy
import numpy as np
from PIL import Image, ImageTk, ImageDraw, ImageFont
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib
matplotlib.use('Agg')
import pygame
import threading
import os

def play_music():
    """在新线程中播放音乐"""
    folder_path = os.path.dirname(__file__)
    music_path = os.path.join(folder_path, 'aigei.ogg')
    try:
        if os.path.exists(music_path):
            pygame.mixer.init()
            pygame.mixer.music.load(music_path)
            pygame.mixer.music.play(-1)  # -1表示循环播放
        else:
            print(f"音乐文件不存在: {music_path}")
    except Exception as e:
        print(f"播放音乐失败: {e}")

class MathHelper:
    def __init__(self, root):
        self.root = root
        self.root.title("初中数学小帮手")
        self.root.geometry("1100x750")
        self.root.configure(bg='#F0F7FF')

        # 启动音乐播放线程
        music_thread = threading.Thread(target=play_music, daemon=True)
        music_thread.start()
        
        # 设置颜色主题
        self.colors = {
            'primary': '#2196F3',
            'secondary': '#4CAF50',
            'accent': '#FF9800',
            'warning': '#F44336',
            'background': '#F0F7FF',
            'card': '#FFFFFF',
            'text': '#333333'
        }
        
        # 初始化界面
        self.setup_ui()
        
        # 初始化历史记录
        self.history = []
        
    def setup_ui(self):
        """设置用户界面"""
        # 创建主框架
        main_frame = tk.Frame(self.root, bg=self.colors['background'])
        main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
        
        # 标题区域
        self.create_title_area(main_frame)
        
        # 创建Notebook(选项卡)
        self.create_notebook(main_frame)
        
        # 结果和历史记录区域
        self.create_result_area(main_frame)
        
        # 底部状态栏
        self.create_status_bar(main_frame)
    
    def create_title_area(self, parent):
        """创建标题区域"""
        title_frame = tk.Frame(parent, bg=self.colors['primary'], height=80)
        title_frame.pack(fill=tk.X, pady=(0, 10))
        title_frame.pack_propagate(False)
        
        # 主标题
        title_label = tk.Label(title_frame,
                              text="🧮 初中数学小帮手 by xhlbudd@52pojie",
                              font=('Microsoft YaHei', 24, 'bold'),
                              bg=self.colors['primary'],
                              fg='white')
        title_label.pack(pady=(10, 0))
        
   
    def create_notebook(self, parent):
        """创建选项卡"""
        notebook_frame = tk.Frame(parent, bg=self.colors['background'])
        notebook_frame.pack(fill=tk.BOTH, expand=True)
        
        # 创建Notebook
        self.notebook = ttk.Notebook(notebook_frame)
        self.notebook.pack(fill=tk.BOTH, expand=True)
        
        # 创建各个选项卡
        self.create_gcd_lcm_tab()
        self.create_prime_tab()
        self.create_power_tab()
        self.create_trigonometry_tab()
        self.create_quadratic_tab()
        self.create_other_tab()
    
    def create_gcd_lcm_tab(self):
        """创建公约数/公倍数选项卡"""
        tab = tk.Frame(self.notebook, bg=self.colors['card'])
        self.notebook.add(tab, text="公约数/公倍数")
        
        # 选项卡标题
        tab_title = tk.Label(tab,
                           text="最大公约数和最小公倍数计算",
                           font=('Microsoft YaHei', 16, 'bold'),
                           bg=self.colors['card'],
                           fg=self.colors['primary'])
        tab_title.pack(pady=20)
        
        # 输入框框架
        input_frame = tk.Frame(tab, bg=self.colors['card'])
        input_frame.pack(pady=10)
        
        tk.Label(input_frame,
                text="输入数字(用空格分隔,如:12 18 24):",
                font=('Microsoft YaHei', 12),
                bg=self.colors['card']).pack(side=tk.LEFT, padx=(0, 10))
        
        self.numbers_var = tk.StringVar()
        self.numbers_entry = tk.Entry(input_frame,
                                     textvariable=self.numbers_var,
                                     font=('Microsoft YaHei', 12),
                                     width=30,
                                     relief=tk.SUNKEN,
                                     borderwidth=2)
        self.numbers_entry.pack(side=tk.LEFT, padx=(0, 20))
        
        # 示例按钮
        example_btn = tk.Button(input_frame,
                               text="示例",
                               command=lambda: self.numbers_var.set("12 18 24"),
                               font=('Microsoft YaHei', 10),
                               bg=self.colors['accent'],
                               fg='white',
                               padx=10)
        example_btn.pack(side=tk.LEFT)
        
        # 按钮框架
        btn_frame = tk.Frame(tab, bg=self.colors['card'])
        btn_frame.pack(pady=20)
        
        btn_style = {'font': ('Microsoft YaHei', 12, 'bold'),
                    'padx': 20,
                    'pady': 10,
                    'relief': tk.RAISED,
                    'borderwidth': 2}
        
        gcd_btn = tk.Button(btn_frame,
                          text="计算最大公约数",
                          command=self.calculate_gcd,
                          bg='#4CAF50',
                          fg='white',
                          **btn_style)
        gcd_btn.pack(side=tk.LEFT, padx=10)
        
        lcm_btn = tk.Button(btn_frame,
                          text="计算最小公倍数",
                          command=self.calculate_lcm,
                          bg='#2196F3',
                          fg='white',
                          **btn_style)
        lcm_btn.pack(side=tk.LEFT, padx=10)
        
        clear_btn = tk.Button(btn_frame,
                            text="清空",
                            command=lambda: self.numbers_var.set(""),
                            bg='#9E9E9E',
                            fg='white',
                            **btn_style)
        clear_btn.pack(side=tk.LEFT, padx=10)
        
        # 结果框架
        result_frame = tk.Frame(tab, bg=self.colors['card'])
        result_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=10)
        
        # 结果显示
        self.gcd_lcm_result = scrolledtext.ScrolledText(result_frame,
                                                       height=6,
                                                       font=('Microsoft YaHei', 12),
                                                       bg='#FAFAFA',
                                                       wrap=tk.WORD)
        self.gcd_lcm_result.pack(fill=tk.BOTH, expand=True)
        
        # 解释说明
        explanation = """
        知识要点:
        • 最大公约数(GCD):几个数公有的约数中最大的一个
        • 最小公倍数(LCM):几个数公有的倍数中最小的一个
        
        计算方法:
        1. 列举法:列出所有约数/倍数,找出公共的
        2. 质因数分解法:分解质因数后计算
        3. 短除法:用公有质因数连续去除
        
        示例:12 和 18
        12的约数:1,2,3,4,6,12
        18的约数:1,2,3,6,9,18
        最大公约数:6
        最小公倍数:36
        """
        
        explanation_label = tk.Label(tab,
                                   text=explanation,
                                   font=('Microsoft YaHei', 10),
                                   bg='#FFF3E0',
                                   fg='#5D4037',
                                   justify=tk.LEFT,
                                   wraplength=800)
        explanation_label.pack(fill=tk.X, padx=20, pady=10)

        
    
    def create_prime_tab(self):
        """创建素数选项卡"""
        tab = tk.Frame(self.notebook, bg=self.colors['card'])
        self.notebook.add(tab, text="素数计算")
        
        # 选项卡标题
        tab_title = tk.Label(tab,
                           text="素数(质数)计算器",
                           font=('Microsoft YaHei', 16, 'bold'),
                           bg=self.colors['card'],
                           fg=self.colors['primary'])
        tab_title.pack(pady=20)
        
        # 输入框架
        input_frame = tk.Frame(tab, bg=self.colors['card'])
        input_frame.pack(pady=10)
        
        tk.Label(input_frame,
                text="输入N的值(查找N以内的所有素数):",
                font=('Microsoft YaHei', 12),
                bg=self.colors['card']).pack(side=tk.LEFT, padx=(0, 10))
        
        self.n_prime_var = tk.StringVar()
        self.n_prime_entry = tk.Entry(input_frame,
                                     textvariable=self.n_prime_var,
                                     font=('Microsoft YaHei', 12),
                                     width=15,
                                     relief=tk.SUNKEN,
                                     borderwidth=2)
        self.n_prime_entry.pack(side=tk.LEFT, padx=(0, 20))
        
        # 示例按钮
        example_btn = tk.Button(input_frame,
                               text="示例",
                               command=lambda: self.n_prime_var.set("100"),
                               font=('Microsoft YaHei', 10),
                               bg=self.colors['accent'],
                               fg='white',
                               padx=10)
        example_btn.pack(side=tk.LEFT)
        
        # 功能选择
        func_frame = tk.Frame(tab, bg=self.colors['card'])
        func_frame.pack(pady=20)
        
        tk.Label(func_frame,
                text="请选择功能:",
                font=('Microsoft YaHei', 12),
                bg=self.colors['card']).pack(side=tk.LEFT, padx=(0, 20))
        
        # 单选按钮
        self.prime_func_var = tk.StringVar(value="list")
        
        tk.Radiobutton(func_frame,
                      text="列出所有素数",
                      variable=self.prime_func_var,
                      value="list",
                      font=('Microsoft YaHei', 11),
                      bg=self.colors['card']).pack(side=tk.LEFT, padx=10)
        
        tk.Radiobutton(func_frame,
                      text="判断是否为素数",
                      variable=self.prime_func_var,
                      value="check",
                      font=('Microsoft YaHei', 11),
                      bg=self.colors['card']).pack(side=tk.LEFT, padx=10)
        
        tk.Radiobutton(func_frame,
                      text="素数个数统计",
                      variable=self.prime_func_var,
                      value="count",
                      font=('Microsoft YaHei', 11),
                      bg=self.colors['card']).pack(side=tk.LEFT, padx=10)
        
        # 按钮框架
        btn_frame = tk.Frame(tab, bg=self.colors['card'])
        btn_frame.pack(pady=10)
        
        calculate_btn = tk.Button(btn_frame,
                                text="开始计算",
                                command=self.calculate_prime,
                                font=('Microsoft YaHei', 12, 'bold'),
                                bg='#4CAF50',
                                fg='white',
                                padx=30,
                                pady=10)
        calculate_btn.pack(side=tk.LEFT, padx=5)
        
        clear_btn = tk.Button(btn_frame,
                            text="清空结果",
                            command=self.clear_prime_result,
                            font=('Microsoft YaHei', 12),
                            bg='#9E9E9E',
                            fg='white',
                            padx=20,
                            pady=10)
        clear_btn.pack(side=tk.LEFT, padx=5)
        
        # 结果显示框架
        result_frame = tk.Frame(tab, bg=self.colors['card'])
        result_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=10)
        
        # 结果显示
        self.prime_result = scrolledtext.ScrolledText(result_frame,
                                                     height=8,
                                                     font=('Microsoft YaHei', 12),
                                                     bg='#FAFAFA',
                                                     wrap=tk.WORD)
        self.prime_result.pack(fill=tk.BOTH, expand=True)
        
        # 解释说明
        explanation = """
        素数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
        前20个素数:2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71        
        重要性质:
        1. 2是唯一的偶素数
        2. 每个合数都可以唯一分解为素数的乘积
        3. 素数有无穷多个(欧几里得证明)
        """
        
        explanation_label = tk.Label(tab,
                                   text=explanation,
                                   font=('Microsoft YaHei', 10),
                                   bg='#E8F5E9',
                                   fg='#1B5E20',
                                   justify=tk.LEFT,
                                   wraplength=800)
        explanation_label.pack(fill=tk.X, padx=20, pady=10)
    
    def create_power_tab(self):
        """创建幂运算选项卡"""
        tab = tk.Frame(self.notebook, bg=self.colors['card'])
        self.notebook.add(tab, text="幂运算")
        
        # 选项卡标题
        tab_title = tk.Label(tab,
                           text="幂运算和根式运算",
                           font=('Microsoft YaHei', 16, 'bold'),
                           bg=self.colors['card'],
                           fg=self.colors['primary'])
        tab_title.pack(pady=20)
        
        # 输入框架
        input_frame = tk.Frame(tab, bg=self.colors['card'])
        input_frame.pack(pady=20)
        
        tk.Label(input_frame,
                text="输入数字:",
                font=('Microsoft YaHei', 12),
                bg=self.colors['card']).grid(row=0, column=0, padx=5, pady=5, sticky=tk.W)
        
        self.power_num_var = tk.StringVar()
        self.power_num_entry = tk.Entry(input_frame,
                                       textvariable=self.power_num_var,
                                       font=('Microsoft YaHei', 12),
                                       width=15,
                                       relief=tk.SUNKEN,
                                       borderwidth=2)
        self.power_num_entry.grid(row=0, column=1, padx=5, pady=5)
        
        # 功能按钮框架
        func_frame = tk.Frame(tab, bg=self.colors['card'])
        func_frame.pack(pady=20)
        
        btn_style = {'font': ('Microsoft YaHei', 11, 'bold'),
                    'padx': 15,
                    'pady': 8,
                    'relief': tk.RAISED,
                    'borderwidth': 2,
                    'width': 10}
        
        # 第一行按钮
        row1_frame = tk.Frame(func_frame, bg=self.colors['card'])
        row1_frame.pack(pady=5)
        
        tk.Button(row1_frame,
                 text="平方",
                 command=lambda: self.calculate_power(2),
                 bg='#2196F3',
                 fg='white',
                 **btn_style).pack(side=tk.LEFT, padx=5)
        
        tk.Button(row1_frame,
                 text="立方",
                 command=lambda: self.calculate_power(3),
                 bg='#2196F3',
                 fg='white',
                 **btn_style).pack(side=tk.LEFT, padx=5)
        
        tk.Button(row1_frame,
                 text="平方根",
                 command=lambda: self.calculate_root(2),
                 bg='#4CAF50',
                 fg='white',
                 **btn_style).pack(side=tk.LEFT, padx=5)
        
        tk.Button(row1_frame,
                 text="立方根",
                 command=lambda: self.calculate_root(3),
                 bg='#4CAF50',
                 fg='white',
                 **btn_style).pack(side=tk.LEFT, padx=5)
        
        # 第二行按钮
        row2_frame = tk.Frame(func_frame, bg=self.colors['card'])
        row2_frame.pack(pady=5)
        
        tk.Button(row2_frame,
                 text="倒数",
                 command=self.calculate_reciprocal,
                 bg='#FF9800',
                 fg='white',
                 **btn_style).pack(side=tk.LEFT, padx=5)
        
        tk.Button(row2_frame,
                 text="绝对值",
                 command=self.calculate_abs,
                 bg='#FF9800',
                 fg='white',
                 **btn_style).pack(side=tk.LEFT, padx=5)
        
        tk.Button(row2_frame,
                 text="相反数",
                 command=self.calculate_opposite,
                 bg='#FF9800',
                 fg='white',
                 **btn_style).pack(side=tk.LEFT, padx=5)
        
        tk.Button(row2_frame,
                 text="四舍五入",
                 command=self.calculate_round,
                 bg='#9C27B0',
                 fg='white',
                 **btn_style).pack(side=tk.LEFT, padx=5)
        
        # 自定义指数框架
        custom_frame = tk.Frame(tab, bg=self.colors['card'])
        custom_frame.pack(pady=20)
        
        tk.Label(custom_frame,
                text="自定义指数:",
                font=('Microsoft YaHei', 12),
                bg=self.colors['card']).pack(side=tk.LEFT, padx=(0, 10))
        
        self.custom_power_var = tk.StringVar()
        self.custom_power_entry = tk.Entry(custom_frame,
                                         textvariable=self.custom_power_var,
                                         font=('Microsoft YaHei', 12),
                                         width=8,
                                         relief=tk.SUNKEN,
                                         borderwidth=2)
        self.custom_power_entry.pack(side=tk.LEFT, padx=(0, 10))
        
        tk.Button(custom_frame,
                 text="计算幂",
                 command=self.calculate_custom_power,
                 font=('Microsoft YaHei', 11),
                 bg='#F44336',
                 fg='white',
                 padx=15,
                 pady=5).pack(side=tk.LEFT, padx=(0, 10))
        
        tk.Button(custom_frame,
                 text="计算根",
                 command=self.calculate_custom_root,
                 font=('Microsoft YaHei', 11),
                 bg='#F44336',
                 fg='white',
                 padx=15,
                 pady=5).pack(side=tk.LEFT)
        
        # 结果显示
        result_frame = tk.Frame(tab, bg=self.colors['card'])
        result_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=10)
        
        self.power_result = tk.Text(result_frame,
                                   height=6,
                                   font=('Microsoft YaHei', 12),
                                   bg='#FAFAFA',
                                   wrap=tk.WORD)
        self.power_result.pack(fill=tk.BOTH, expand=True)
        
        # 公式说明
        formula_label = tk.Label(tab,
                               text="常见公式:\n"
                                    "• 平方:a² = a × a\n"
                                    "• 立方:a³ = a × a × a\n"
                                    "• 平方根:√a = b 使得 b² = a\n"
                                    "• 立方根:³√a = b 使得 b³ = a",
                               font=('Microsoft YaHei', 10),
                               bg='#F3E5F5',
                               fg='#4A148C',
                               justify=tk.LEFT)
        formula_label.pack(fill=tk.X, padx=20, pady=10)
    
    def create_trigonometry_tab(self):
        """创建三角函数选项卡"""
        tab = tk.Frame(self.notebook, bg=self.colors['card'])
        self.notebook.add(tab, text="三角函数")
        
        # 选项卡标题
        tab_title = tk.Label(tab,
                           text="三角函数计算器",
                           font=('Microsoft YaHei', 16, 'bold'),
                           bg=self.colors['card'],
                           fg=self.colors['primary'])
        tab_title.pack(pady=20)
        
        # 输入框架
        input_frame = tk.Frame(tab, bg=self.colors['card'])
        input_frame.pack(pady=20)
        
        tk.Label(input_frame,
                text="输入角度(单位:度):",
                font=('Microsoft YaHei', 12),
                bg=self.colors['card']).pack(side=tk.LEFT, padx=(0, 10))
        
        self.angle_var = tk.StringVar()
        self.angle_entry = tk.Entry(input_frame,
                                   textvariable=self.angle_var,
                                   font=('Microsoft YaHei', 12),
                                   width=15,
                                   relief=tk.SUNKEN,
                                   borderwidth=2)
        self.angle_entry.pack(side=tk.LEFT, padx=(0, 20))
        
        # 特殊角度按钮
        special_frame = tk.Frame(tab, bg=self.colors['card'])
        special_frame.pack(pady=10)
        
        tk.Label(special_frame,
                text="特殊角度:",
                font=('Microsoft YaHei', 11),
                bg=self.colors['card']).pack(side=tk.LEFT, padx=(0, 10))
        
        special_angles = [("0°", 0), ("30°", 30), ("45°", 45), ("60°", 60), ("90°", 90)]
        
        for text, angle in special_angles:
            tk.Button(special_frame,
                     text=text,
                     command=lambda a=angle: self.angle_var.set(str(a)),
                     font=('Microsoft YaHei', 10),
                     bg='#E3F2FD',
                     padx=8,
                     pady=3).pack(side=tk.LEFT, padx=5)
        
        # 三角函数按钮
        trig_frame = tk.Frame(tab, bg=self.colors['card'])
        trig_frame.pack(pady=20)
        
        btn_style = {'font': ('Microsoft YaHei', 12, 'bold'),
                    'padx': 20,
                    'pady': 10,
                    'relief': tk.RAISED,
                    'borderwidth': 2,
                    'width': 8}
        
        # 第一行
        row1_frame = tk.Frame(trig_frame, bg=self.colors['card'])
        row1_frame.pack(pady=5)
        
        tk.Button(row1_frame,
                 text="sin",
                 command=lambda: self.calculate_trig('sin'),
                 bg='#2196F3',
                 fg='white',
                 **btn_style).pack(side=tk.LEFT, padx=5)
        
        tk.Button(row1_frame,
                 text="cos",
                 command=lambda: self.calculate_trig('cos'),
                 bg='#4CAF50',
                 fg='white',
                 **btn_style).pack(side=tk.LEFT, padx=5)
        
        tk.Button(row1_frame,
                 text="tan",
                 command=lambda: self.calculate_trig('tan'),
                 bg='#FF9800',
                 fg='white',
                 **btn_style).pack(side=tk.LEFT, padx=5)
        
        # 第二行
        row2_frame = tk.Frame(trig_frame, bg=self.colors['card'])
        row2_frame.pack(pady=5)
        
        tk.Button(row2_frame,
                 text="asin",
                 command=lambda: self.calculate_trig('asin'),
                 bg='#9C27B0',
                 fg='white',
                 **btn_style).pack(side=tk.LEFT, padx=5)
        
        tk.Button(row2_frame,
                 text="acos",
                 command=lambda: self.calculate_trig('acos'),
                 bg='#F44336',
                 fg='white',
                 **btn_style).pack(side=tk.LEFT, padx=5)
        
        tk.Button(row2_frame,
                 text="atan",
                 command=lambda: self.calculate_trig('atan'),
                 bg='#795548',
                 fg='white',
                 **btn_style).pack(side=tk.LEFT, padx=5)
        
        # 结果显示
        result_frame = tk.Frame(tab, bg=self.colors['card'])
        result_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=10)
        
        self.trig_result = tk.Text(result_frame,
                                  height=8,
                                  font=('Microsoft YaHei', 12),
                                  bg='#FAFAFA',
                                  wrap=tk.WORD)
        self.trig_result.pack(fill=tk.BOTH, expand=True)
        
        # 三角函数表
        table_frame = tk.Frame(tab, bg=self.colors['card'])
        table_frame.pack(fill=tk.X, padx=20, pady=10)
        
        table_text = """
        三角函数是数学中研究直角三角形边角关系的基础工具,核心包括正弦(sin)、余弦(cos)和正切(tan)。
        它们将角度与边长比值对应,广泛应用于测量、物理振动分析和工程计算中。
        """
        
        table_label = tk.Label(table_frame,
                              text=table_text,
                              font=('Microsoft YaHei', 10),
                              bg='#FFF3E0',
                              fg='#5D4037',
                              justify=tk.LEFT)
        table_label.pack(fill=tk.X)
    
    def create_quadratic_tab(self):
        """创建一元二次方程选项卡"""
        tab = tk.Frame(self.notebook, bg=self.colors['card'])
        self.notebook.add(tab, text="一元二次方程")
        
        # 选项卡标题
        tab_title = tk.Label(tab,
                           text="一元二次方程求解器",
                           font=('Microsoft YaHei', 16, 'bold'),
                           bg=self.colors['card'],
                           fg=self.colors['primary'])
        tab_title.pack(pady=20)
        
        # 输入框架
        input_frame = tk.Frame(tab, bg=self.colors['card'])
        input_frame.pack(pady=20)
        
        tk.Label(input_frame,
                text="标准形式:ax² + bx + c = 0",
                font=('Microsoft YaHei', 12, 'bold'),
                bg=self.colors['card']).grid(row=0, column=0, columnspan=3, pady=10)
        
        # 系数输入
        tk.Label(input_frame,
                text="系数 a:",
                font=('Microsoft YaHei', 12),
                bg=self.colors['card']).grid(row=1, column=0, padx=5, pady=5, sticky=tk.E)
        
        self.coeff_a_var = tk.StringVar(value="1")
        tk.Entry(input_frame,
                textvariable=self.coeff_a_var,
                font=('Microsoft YaHei', 12),
                width=10,
                relief=tk.SUNKEN,
                borderwidth=2).grid(row=1, column=1, padx=5, pady=5)
        
        # 示例按钮
        tk.Button(input_frame,
                 text="示例1",
                 command=lambda: self.set_quadratic_example(1, -5, 6),
                 font=('Microsoft YaHei', 10),
                 bg='#BBDEFB',
                 padx=8).grid(row=1, column=2, padx=5, pady=5)
        
        tk.Label(input_frame,
                text="系数 b:",
                font=('Microsoft YaHei', 12),
                bg=self.colors['card']).grid(row=2, column=0, padx=5, pady=5, sticky=tk.E)
        
        self.coeff_b_var = tk.StringVar(value="0")
        tk.Entry(input_frame,
                textvariable=self.coeff_b_var,
                font=('Microsoft YaHei', 12),
                width=10,
                relief=tk.SUNKEN,
                borderwidth=2).grid(row=2, column=1, padx=5, pady=5)
        
        tk.Button(input_frame,
                 text="示例2",
                 command=lambda: self.set_quadratic_example(1, 2, 1),
                 font=('Microsoft YaHei', 10),
                 bg='#BBDEFB',
                 padx=8).grid(row=2, column=2, padx=5, pady=5)
        
        tk.Label(input_frame,
                text="系数 c:",
                font=('Microsoft YaHei', 12),
                bg=self.colors['card']).grid(row=3, column=0, padx=5, pady=5, sticky=tk.E)
        
        self.coeff_c_var = tk.StringVar(value="0")
        tk.Entry(input_frame,
                textvariable=self.coeff_c_var,
                font=('Microsoft YaHei', 12),
                width=10,
                relief=tk.SUNKEN,
                borderwidth=2).grid(row=3, column=1, padx=5, pady=5)
        
        tk.Button(input_frame,
                 text="示例3",
                 command=lambda: self.set_quadratic_example(1, 1, 1),
                 font=('Microsoft YaHei', 10),
                 bg='#BBDEFB',
                 padx=8).grid(row=3, column=2, padx=5, pady=5)
        
        # 求解按钮
        solve_frame = tk.Frame(tab, bg=self.colors['card'])
        solve_frame.pack(pady=20)
        
        tk.Button(solve_frame,
                 text="求解方程",
                 command=self.solve_quadratic,
                 font=('Microsoft YaHei', 12, 'bold'),
                 bg='#4CAF50',
                 fg='white',
                 padx=30,
                 pady=10).pack(side=tk.LEFT, padx=5)
        
        tk.Button(solve_frame,
                 text="清空",
                 command=self.clear_quadratic,
                 font=('Microsoft YaHei', 12),
                 bg='#9E9E9E',
                 fg='white',
                 padx=20,
                 pady=10).pack(side=tk.LEFT, padx=5)
        
        # 结果显示
        result_frame = tk.Frame(tab, bg=self.colors['card'])
        result_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=10)
        
        self.quadratic_result = tk.Text(result_frame,
                                       height=8,
                                       font=('Microsoft YaHei', 12),
                                       bg='#FAFAFA',
                                       wrap=tk.WORD)
        self.quadratic_result.pack(fill=tk.BOTH, expand=True)
        
        # 公式说明
        formula_frame = tk.Frame(tab, bg=self.colors['card'])
        formula_frame.pack(fill=tk.X, padx=20, pady=10)
        
        formula_text = """
        一元二次方程求根公式:
        x = [-b ± √(b² - 4ac)] / (2a)
        """
        
        formula_label = tk.Label(formula_frame,
                                text=formula_text,
                                font=('Microsoft YaHei', 10),
                                bg='#E8F5E9',
                                fg='#1B5E20',
                                justify=tk.LEFT)
        formula_label.pack(fill=tk.X)
    
    def create_other_tab(self):
        """创建其他计算选项卡"""
        tab = tk.Frame(self.notebook, bg=self.colors['card'])
        self.notebook.add(tab, text="其他计算")
        
        # 选项卡标题
        tab_title = tk.Label(tab,
                           text="其他数学计算",
                           font=('Microsoft YaHei', 16, 'bold'),
                           bg=self.colors['card'],
                           fg=self.colors['primary'])
        tab_title.pack(pady=20)
        
        # 功能按钮网格
        func_frame = tk.Frame(tab, bg=self.colors['card'])
        func_frame.pack(pady=20)
        
        other_funcs = [
            ("阶乘", self.calculate_factorial, "#2196F3"),
            ("排列A(n,m)", self.calculate_permutation, "#4CAF50"),
            ("组合C(n,m)", self.calculate_combination, "#FF9800"),
            ("对数", self.calculate_log, "#9C27B0"),
            ("圆周率", self.show_pi, "#F44336"),
            ("自然对数e", self.show_e, "#795548"),
            ("平均值", self.calculate_mean, "#607D8B"),
            ("方差", self.calculate_variance, "#009688"),
        ]
        
        for i, (text, command, color) in enumerate(other_funcs):
            row = i // 4
            col = i % 4
            
            btn = tk.Button(func_frame,
                          text=text,
                          command=command,
                          font=('Microsoft YaHei', 11, 'bold'),
                          bg=color,
                          fg='white',
                          padx=10,
                          pady=8,
                          relief=tk.RAISED,
                          borderwidth=2)
            btn.grid(row=row, column=col, padx=5, pady=5, sticky="nsew")
            func_frame.grid_columnconfigure(col, weight=1)
        
        # 结果显示
        result_frame = tk.Frame(tab, bg=self.colors['card'])
        result_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=10)
        
        self.other_result = scrolledtext.ScrolledText(result_frame,
                                                     height=10,
                                                     font=('Microsoft YaHei', 12),
                                                     bg='#FAFAFA',
                                                     wrap=tk.WORD)
        self.other_result.pack(fill=tk.BOTH, expand=True)
        
        # 数学常数
        constant_frame = tk.Frame(tab, bg=self.colors['card'])
        constant_frame.pack(fill=tk.X, padx=20, pady=10)
        
        constant_text = """
        π ≈ 3.14159265358979323846
        e ≈ 2.71828182845904523536
        φ ≈ 1.61803398874989484820(黄金比例)
        
        圆的面积:S = πr²
        圆的周长:C = 2πr
        球体积:V = (4/3)πr³
        球表面积:S = 4πr²
        """
        
        constant_label = tk.Label(constant_frame,
                                 text=constant_text,
                                 font=('Microsoft YaHei', 10),
                                 bg='#F3E5F5',
                                 fg='#4A148C',
                                 justify=tk.LEFT)
        constant_label.pack(fill=tk.X)
    
    def create_result_area(self, parent):
        """创建结果和历史记录区域"""
        result_frame = tk.Frame(parent, bg=self.colors['card'], relief=tk.RAISED, borderwidth=2)
        result_frame.pack(fill=tk.X, pady=(10, 5))
        
        # 结果标签
        result_label = tk.Label(result_frame,
                               text="计算结果:",
                               font=('Microsoft YaHei', 14, 'bold'),
                               bg=self.colors['card'],
                               fg=self.colors['primary'])
        result_label.pack(anchor=tk.W, padx=20, pady=10)
        
        # 结果显示框
        self.main_result = scrolledtext.ScrolledText(result_frame,
                                                    height=6,
                                                    font=('Microsoft YaHei', 12),
                                                    bg='#FAFAFA',
                                                    wrap=tk.WORD)
        self.main_result.pack(fill=tk.BOTH, expand=True, padx=20, pady=(0, 10))
        
        # 历史记录按钮
        history_btn = tk.Button(result_frame,
                               text="📋 复制结果",
                               command=self.copy_result,
                               font=('Microsoft YaHei', 10),
                               bg='#2196F3',
                               fg='white',
                               padx=10)
        history_btn.pack(side=tk.RIGHT, padx=20, pady=(0, 10))
        
        clear_btn = tk.Button(result_frame,
                             text="🗑️ 清空记录",
                             command=self.clear_history,
                             font=('Microsoft YaHei', 10),
                             bg='#F44336',
                             fg='white',
                             padx=10)
        clear_btn.pack(side=tk.RIGHT, padx=5, pady=(0, 10))
    
    def create_status_bar(self, parent):
        """创建状态栏"""
        status_frame = tk.Frame(parent, bg='#333333', height=30)
        status_frame.pack(side=tk.BOTTOM, fill=tk.X)
        status_frame.pack_propagate(False)
        
        self.status_label = tk.Label(status_frame,
                                   text="就绪 | 欢迎使用初中数学计算小助手!",
                                   font=('Microsoft YaHei', 10),
                                   bg='#333333',
                                   fg='white')
        self.status_label.pack(side=tk.LEFT, padx=20)
        
        version_label = tk.Label(status_frame,
                                text="版本 1.0 | 适合初中数学学习使用",
                                font=('Microsoft YaHei', 9),
                                bg='#333333',
                                fg='#BBBBBB')
        version_label.pack(side=tk.RIGHT, padx=20)
    
    def update_status(self, message):
        """更新状态栏"""
        self.status_label.config(text=message)
        self.root.update()
    
    def update_result(self, result_text, add_to_history=True):
        """更新结果显示"""
        self.main_result.delete(1.0, tk.END)
        self.main_result.insert(tk.END, result_text)
        
        if add_to_history and result_text.strip():
            self.history.append(result_text)
            if len(self.history) > 10:  # 只保留最近10条记录
                self.history.pop(0)
    
    def copy_result(self):
        """复制结果到剪贴板"""
        result = self.main_result.get(1.0, tk.END).strip()
        if result:
            self.root.clipboard_clear()
            self.root.clipboard_append(result)
            self.update_status("结果已复制到剪贴板!")
        else:
            self.update_status("没有可复制的结果")
    
    def clear_history(self):
        """清空历史记录"""
        self.history = []
        self.update_result("历史记录已清空!", add_to_history=False)
        self.update_status("历史记录已清空")
    
    # ========== 公约数/公倍数计算 ==========
    def calculate_gcd(self):
        """计算最大公约数"""
        try:
            numbers_str = self.numbers_var.get().strip()
            if not numbers_str:
                messagebox.showwarning("输入错误", "请输入数字!")
                return
            
            numbers = list(map(int, numbers_str.split()))
            
            if len(numbers) < 2:
                messagebox.showwarning("输入错误", "请输入至少两个数字!")
                return
            
            # 计算最大公约数
            result = numbers[0]
            for num in numbers[1:]:
                result = math.gcd(result, num)
            
            # 更新结果
            result_text = f"数字:{numbers}\n"
            result_text += f"最大公约数(GCD) = {result}\n\n"
            
            # 显示计算过程
            result_text += "计算过程:\n"
            for i, num in enumerate(numbers):
                divisors = [str(d) for d in range(1, num+1) if num % d == 0]
                result_text += f"{num}的约数:{', '.join(divisors)}\n"
            
            self.update_result(result_text)
            self.update_status(f"计算完成:{numbers} 的最大公约数是 {result}")
            
            # 更新选项卡内结果
            self.gcd_lcm_result.delete(1.0, tk.END)
            self.gcd_lcm_result.insert(tk.END, result_text)
            
        except ValueError:
            messagebox.showerror("输入错误", "请输入有效的数字!")
    
    def calculate_lcm(self):
        """计算最小公倍数"""
        try:
            numbers_str = self.numbers_var.get().strip()
            if not numbers_str:
                messagebox.showwarning("输入错误", "请输入数字!")
                return
            
            numbers = list(map(int, numbers_str.split()))
            
            if len(numbers) < 2:
                messagebox.showwarning("输入错误", "请输入至少两个数字!")
                return
            
            # 计算最小公倍数
            def lcm(a, b):
                return abs(a * b) // math.gcd(a, b)
            
            result = numbers[0]
            for num in numbers[1:]:
                result = lcm(result, num)
            
            # 更新结果
            result_text = f"数字:{numbers}\n"
            result_text += f"最小公倍数(LCM) = {result}\n\n"
            
            # 显示计算过程
            result_text += "计算过程:\n"
            for i, num in enumerate(numbers):
                multiples = [str(num * m) for m in range(1, 6)]  # 显示前5个倍数
                result_text += f"{num}的倍数:{', '.join(multiples)}...\n"
            
            self.update_result(result_text)
            self.update_status(f"计算完成:{numbers} 的最小公倍数是 {result}")
            
            # 更新选项卡内结果
            self.gcd_lcm_result.delete(1.0, tk.END)
            self.gcd_lcm_result.insert(tk.END, result_text)
            
        except ValueError:
            messagebox.showerror("输入错误", "请输入有效的数字!")
    
    # ========== 素数计算 ==========
    def calculate_prime(self):
        """计算素数"""
        try:
            func_type = self.prime_func_var.get()
            n_str = self.n_prime_var.get().strip()
            
            if not n_str:
                messagebox.showwarning("输入错误", "请输入N的值!")
                return
            
            n = int(n_str)
            
            if n < 2:
                messagebox.showwarning("输入错误", "请输入大于1的整数!")
                return
            
            if func_type == "list":
                # 列出所有素数
                primes = []
                for num in range(2, n + 1):
                    if all(num % i != 0 for i in range(2, int(math.sqrt(num)) + 1)):
                        primes.append(num)
                
                result_text = f"{n}以内的所有素数:\n"
                result_text += ", ".join(map(str, primes)) + "\n\n"
                result_text += f"共有 {len(primes)} 个素数\n"
                
            elif func_type == "check":
                # 判断是否为素数
                is_prime = True
                if n < 2:
                    is_prime = False
                else:
                    for i in range(2, int(math.sqrt(n)) + 1):
                        if n % i == 0:
                            is_prime = False
                            break
                
                if is_prime:
                    result_text = f"{n} 是素数!\n\n"
                    result_text += f"{n}只能被1和它自身整除。\n"
                else:
                    result_text = f"{n} 不是素数!\n\n"
                    result_text += f"{n}是合数,可以被以下数整除:\n"
                    divisors = [str(i) for i in range(1, n+1) if n % i == 0]
                    result_text += ", ".join(divisors)
            
            else:  # count
                # 统计素数个数
                count = 0
                for num in range(2, n + 1):
                    if all(num % i != 0 for i in range(2, int(math.sqrt(num)) + 1)):
                        count += 1
                
                result_text = f"{n}以内的素数个数:{count}\n\n"
                if n <= 1000:
                    primes = []
                    for num in range(2, n + 1):
                        if all(num % i != 0 for i in range(2, int(math.sqrt(num)) + 1)):
                            primes.append(num)
                    if primes:
                        result_text += f"前20个素数:{', '.join(map(str, primes[:20]))}\n"
            
            self.update_result(result_text)
            self.update_status(f"素数计算完成:N = {n}")
            
            # 更新选项卡内结果
            self.prime_result.delete(1.0, tk.END)
            self.prime_result.insert(tk.END, result_text)
            
        except ValueError:
            messagebox.showerror("输入错误", "请输入有效的整数!")
    
    def clear_prime_result(self):
        """清空素数结果"""
        self.prime_result.delete(1.0, tk.END)
        self.update_status("素数结果已清空")
    
    # ========== 幂运算 ==========
    def calculate_power(self, power):
        """计算幂"""
        try:
            num_str = self.power_num_var.get().strip()
            if not num_str:
                messagebox.showwarning("输入错误", "请输入数字!")
                return
            
            num = float(num_str)
            result = num ** power
            
            if power == 2:
                operation = "平方"
                symbol = "&#178;"
            elif power == 3:
                operation = "立方"
                symbol = "&#179;"
            else:
                operation = f"{power}次方"
                symbol = f"^{power}"
            
            result_text = f"{num}{symbol} = {result}\n\n"
            
            if power == 2:
                result_text += f"计算过程:{num} × {num} = {result}"
            elif power == 3:
                result_text += f"计算过程:{num} × {num} × {num} = {result}"
            
            self.update_result(result_text)
            self.update_status(f"计算完成:{num} 的{operation}是 {result}")
            
            # 更新选项卡内结果
            self.power_result.delete(1.0, tk.END)
            self.power_result.insert(tk.END, result_text)
            
        except ValueError:
            messagebox.showerror("输入错误", "请输入有效的数字!")
    
    def calculate_root(self, root):
        """计算根"""
        try:
            num_str = self.power_num_var.get().strip()
            if not num_str:
                messagebox.showwarning("输入错误", "请输入数字!")
                return
            
            num = float(num_str)
            
            if num < 0 and root % 2 == 0:
                messagebox.showerror("计算错误", "负数没有实数平方根!")
                return
            
            if root == 2:
                operation = "平方根"
                symbol = "√"
                result = math.sqrt(num)
            elif root == 3:
                operation = "立方根"
                symbol = "&#179;√"
                result = num ** (1/3)
            
            result_text = f"{symbol}{num} = {result}\n\n"
            
            if root == 2:
                result_text += f"验证:{result} × {result} = {result*result}"
            elif root == 3:
                result_text += f"验证:{result} × {result} × {result} = {result**3}"
            
            self.update_result(result_text)
            self.update_status(f"计算完成:{num} 的{operation}是 {result}")
            
            # 更新选项卡内结果
            self.power_result.delete(1.0, tk.END)
            self.power_result.insert(tk.END, result_text)
            
        except ValueError:
            messagebox.showerror("输入错误", "请输入有效的数字!")
    
    def calculate_custom_power(self):
        """计算自定义幂"""
        try:
            num_str = self.power_num_var.get().strip()
            power_str = self.custom_power_var.get().strip()
            
            if not num_str or not power_str:
                messagebox.showwarning("输入错误", "请输入数字和指数!")
                return
            
            num = float(num_str)
            power = float(power_str)
            result = num ** power
            
            result_text = f"{num}^{power} = {result}\n\n"
            result_text += f"计算:{num} 的 {power} 次方"
            
            self.update_result(result_text)
            self.update_status(f"计算完成:{num}^{power} = {result}")
            
            # 更新选项卡内结果
            self.power_result.delete(1.0, tk.END)
            self.power_result.insert(tk.END, result_text)
            
        except ValueError:
            messagebox.showerror("输入错误", "请输入有效的数字!")
    
    def calculate_custom_root(self):
        """计算自定义根"""
        try:
            num_str = self.power_num_var.get().strip()
            root_str = self.custom_power_var.get().strip()
            
            if not num_str or not root_str:
                messagebox.showwarning("输入错误", "请输入数字和根次!")
                return
            
            num = float(num_str)
            root = float(root_str)
            
            if root == 0:
                messagebox.showerror("计算错误", "根次不能为0!")
                return
            
            if num < 0 and root % 2 == 0:
                messagebox.showerror("计算错误", "负数没有偶数次实数根!")
                return
            
            result = num ** (1/root)
            
            root_symbol = f"{int(root)}√" if root.is_integer() else f"{root}√"
            result_text = f"{root_symbol}{num} = {result}\n\n"
            result_text += f"计算:{num} 的 {root} 次方根"
            
            self.update_result(result_text)
            self.update_status(f"计算完成:{root}√{num} = {result}")
            
            # 更新选项卡内结果
            self.power_result.delete(1.0, tk.END)
            self.power_result.insert(tk.END, result_text)
            
        except ValueError:
            messagebox.showerror("输入错误", "请输入有效的数字!")
    
    def calculate_reciprocal(self):
        """计算倒数"""
        try:
            num_str = self.power_num_var.get().strip()
            if not num_str:
                messagebox.showwarning("输入错误", "请输入数字!")
                return
            
            num = float(num_str)
            
            if num == 0:
                messagebox.showerror("计算错误", "0没有倒数!")
                return
            
            result = 1 / num
            
            result_text = f"1 / {num} = {result}\n\n"
            result_text += f"{num} 的倒数是 {result}"
            
            self.update_result(result_text)
            self.update_status(f"计算完成:{num} 的倒数是 {result}")
            
            # 更新选项卡内结果
            self.power_result.delete(1.0, tk.END)
            self.power_result.insert(tk.END, result_text)
            
        except ValueError:
            messagebox.showerror("输入错误", "请输入有效的数字!")
    
    def calculate_abs(self):
        """计算绝对值"""
        try:
            num_str = self.power_num_var.get().strip()
            if not num_str:
                messagebox.showwarning("输入错误", "请输入数字!")
                return
            
            num = float(num_str)
            result = abs(num)
            
            result_text = f"|{num}| = {result}\n\n"
            if num < 0:
                result_text += f"{num} 的绝对值是它的相反数"
            else:
                result_text += f"{num} 的绝对值是它本身"
            
            self.update_result(result_text)
            self.update_status(f"计算完成:|{num}| = {result}")
            
            # 更新选项卡内结果
            self.power_result.delete(1.0, tk.END)
            self.power_result.insert(tk.END, result_text)
            
        except ValueError:
            messagebox.showerror("输入错误", "请输入有效的数字!")
    
    def calculate_opposite(self):
        """计算相反数"""
        try:
            num_str = self.power_num_var.get().strip()
            if not num_str:
                messagebox.showwarning("输入错误", "请输入数字!")
                return
            
            num = float(num_str)
            result = -num
            
            result_text = f"-({num}) = {result}\n\n"
            result_text += f"{num} 的相反数是 {result}"
            
            self.update_result(result_text)
            self.update_status(f"计算完成:-({num}) = {result}")
            
            # 更新选项卡内结果
            self.power_result.delete(1.0, tk.END)
            self.power_result.insert(tk.END, result_text)
            
        except ValueError:
            messagebox.showerror("输入错误", "请输入有效的数字!")
    
    def calculate_round(self):
        """四舍五入"""
        try:
            num_str = self.power_num_var.get().strip()
            if not num_str:
                messagebox.showwarning("输入错误", "请输入数字!")
                return
            
            num = float(num_str)
            result = round(num)
            
            result_text = f"round({num}) = {result}\n\n"
            result_text += f"{num} 四舍五入到整数是 {result}"
            
            self.update_result(result_text)
            self.update_status(f"计算完成:round({num}) = {result}")
            
            # 更新选项卡内结果
            self.power_result.delete(1.0, tk.END)
            self.power_result.insert(tk.END, result_text)
            
        except ValueError:
            messagebox.showerror("输入错误", "请输入有效的数字!")
    
    # ========== 三角函数 ==========
    def calculate_trig(self, func):
        """计算三角函数"""
        try:
            angle_str = self.angle_var.get().strip()
            if not angle_str:
                messagebox.showwarning("输入错误", "请输入角度!")
                return
            
            angle = float(angle_str)
            angle_rad = math.radians(angle)
            
            if func == 'sin':
                result = math.sin(angle_rad)
                symbol = 'sin'
            elif func == 'cos':
                result = math.cos(angle_rad)
                symbol = 'cos'
            elif func == 'tan':
                if angle % 90 == 0 and angle % 180 != 0:
                    result_text = f"tan({angle}°) 不存在!\n"
                    result_text += f"当角度为90°+k×180°时,正切函数无定义。"
                    self.update_result(result_text)
                    self.update_status(f"计算:tan({angle}°)不存在")
                    return
                result = math.tan(angle_rad)
                symbol = 'tan'
            elif func == 'asin':
                if angle < -1 or angle > 1:
                    messagebox.showerror("输入错误", "反正弦函数的输入必须在[-1, 1]之间!")
                    return
                result = math.degrees(math.asin(angle))
                symbol = 'arcsin'
            elif func == 'acos':
                if angle < -1 or angle > 1:
                    messagebox.showerror("输入错误", "反余弦函数的输入必须在[-1, 1]之间!")
                    return
                result = math.degrees(math.acos(angle))
                symbol = 'arccos'
            elif func == 'atan':
                result = math.degrees(math.atan(angle))
                symbol = 'arctan'
            
            if func in ['sin', 'cos', 'tan']:
                result_text = f"{symbol}({angle}°) = {result}\n\n"
                
                # 显示常见角度的精确值
                common_angles = {0: 0, 30: 0.5, 45: 0.7071, 60: 0.8660, 90: 1}
                if angle in common_angles:
                    if symbol == 'sin':
                        if angle == 0: exact = "0"
                        elif angle == 30: exact = "1/2"
                        elif angle == 45: exact = "√2/2"
                        elif angle == 60: exact = "√3/2"
                        elif angle == 90: exact = "1"
                    elif symbol == 'cos':
                        if angle == 0: exact = "1"
                        elif angle == 30: exact = "√3/2"
                        elif angle == 45: exact = "√2/2"
                        elif angle == 60: exact = "1/2"
                        elif angle == 90: exact = "0"
                    elif symbol == 'tan':
                        if angle == 0: exact = "0"
                        elif angle == 30: exact = "√3/3"
                        elif angle == 45: exact = "1"
                        elif angle == 60: exact = "√3"
                        elif angle == 90: exact = "∞"
                    
                    if angle != 90 or symbol != 'tan':
                        result_text += f"精确值:{exact} ≈ {common_angles[angle]}\n"
                
            else:  # 反三角函数
                result_text = f"{symbol}({angle}) = {result}°\n\n"
                result_text += f"弧度:{math.radians(result):.4f} rad"
            
            self.update_result(result_text)
            self.update_status(f"计算完成:{symbol}({angle}) = {result}")
            
            # 更新选项卡内结果
            self.trig_result.delete(1.0, tk.END)
            self.trig_result.insert(tk.END, result_text)
            
        except ValueError:
            messagebox.showerror("输入错误", "请输入有效的角度!")
    
    # ========== 一元二次方程 ==========
    def set_quadratic_example(self, a, b, c):
        """设置二次方程示例"""
        self.coeff_a_var.set(str(a))
        self.coeff_b_var.set(str(b))
        self.coeff_c_var.set(str(c))
        self.update_status(f"已设置示例:{a}x&#178; + {b}x + {c} = 0")
    
    def solve_quadratic(self):
        """解一元二次方程"""
        try:
            a = float(self.coeff_a_var.get())
            b = float(self.coeff_b_var.get())
            c = float(self.coeff_c_var.get())
            
            if a == 0:
                messagebox.showerror("输入错误", "二次项系数a不能为0!")
                return
            
            result_text = f"求解方程:{a}x&#178; + {b}x + {c} = 0\n\n"
            
            # 计算判别式
            delta = b**2 - 4*a*c
            result_text += f"判别式 Δ = b&#178; - 4ac = {b}&#178; - 4×{a}×{c} = {delta}\n\n"
            
            if delta > 0:
                # 两个不相等的实根
                x1 = (-b + math.sqrt(delta)) / (2*a)
                x2 = (-b - math.sqrt(delta)) / (2*a)
                result_text += f"Δ > 0,方程有两个不相等的实根:\n"
                result_text += f"x&#8321; = (-b + √Δ)/(2a) = ({-b} + √{delta})/({2*a}) = {x1:.4f}\n"
                result_text += f"x&#8322; = (-b - √Δ)/(2a) = ({-b} - √{delta})/({2*a}) = {x2:.4f}\n\n"
                result_text += f"方程可分解为:{a}(x - {x1:.4f})(x - {x2:.4f}) = 0"
                
            elif delta == 0:
                # 两个相等的实根
                x = -b / (2*a)
                result_text += f"Δ = 0,方程有两个相等的实根:\n"
                result_text += f"x&#8321; = x&#8322; = -b/(2a) = {-b}/({2*a}) = {x:.4f}\n\n"
                result_text += f"方程可分解为:{a}(x - {x:.4f})&#178; = 0"
                
            else:
                # 两个共轭虚根
                real_part = -b / (2*a)
                imag_part = math.sqrt(-delta) / (2*a)
                result_text += f"Δ < 0,方程有两个共轭虚根:\n"
                result_text += f"x&#8321; = {real_part:.4f} + {imag_part:.4f}i\n"
                result_text += f"x&#8322; = {real_part:.4f} - {imag_part:.4f}i"
            
            self.update_result(result_text)
            self.update_status(f"方程求解完成:Δ = {delta}")
            
            # 更新选项卡内结果
            self.quadratic_result.delete(1.0, tk.END)
            self.quadratic_result.insert(tk.END, result_text)
            
        except ValueError:
            messagebox.showerror("输入错误", "请输入有效的系数!")
    
    def clear_quadratic(self):
        """清空二次方程结果"""
        self.quadratic_result.delete(1.0, tk.END)
        self.update_status("二次方程结果已清空")
    
    # ========== 其他计算 ==========
    def calculate_factorial(self):
        """计算阶乘"""
        result_text = "计算阶乘 n! = 1×2×3×...×n\n\n"
        result_text += "请输入n的值(建议n ≤ 20):\n\n"
        
        for n in range(1, 11):
            if n <= 10:
                result = math.factorial(n)
                result_text += f"{n}! = {result}\n"
            else:
                break
        
        self.update_result(result_text)
        self.update_status("显示阶乘表(1-10)")
        
        # 更新其他结果框
        self.other_result.delete(1.0, tk.END)
        self.other_result.insert(tk.END, result_text)
    
    def calculate_permutation(self):
        """计算排列"""
        result_text = "排列 A(n,m) = n! / (n-m)!\n"
        result_text += "从n个不同元素中取出m个元素进行排列\n\n"
        result_text += "常见排列值:\n"
        result_text += "A(5,2) = 20\n"
        result_text += "A(5,3) = 60\n"
        result_text += "A(6,2) = 30\n"
        result_text += "A(6,3) = 120\n"
        
        self.update_result(result_text)
        self.update_status("显示排列公式和示例")
        
        # 更新其他结果框
        self.other_result.delete(1.0, tk.END)
        self.other_result.insert(tk.END, result_text)
    
    def calculate_combination(self):
        """计算组合"""
        result_text = "组合 C(n,m) = n! / [m!(n-m)!]\n"
        result_text += "从n个不同元素中取出m个元素,不考虑顺序\n\n"
        result_text += "常见组合值:\n"
        result_text += "C(5,2) = 10\n"
        result_text += "C(5,3) = 10\n"
        result_text += "C(6,2) = 15\n"
        result_text += "C(6,3) = 20\n"
        
        self.update_result(result_text)
        self.update_status("显示组合公式和示例")
        
        # 更新其他结果框
        self.other_result.delete(1.0, tk.END)
        self.other_result.insert(tk.END, result_text)
    
    def calculate_log(self):
        """计算对数"""
        result_text = "对数函数:\n"
        result_text += "常用对数:log&#8321;&#8320;x 或 lgx\n"
        result_text += "自然对数:log&#8337;x 或 lnx (e≈2.71828)\n\n"
        result_text += "常用对数值:\n"
        result_text += "lg(1) = 0\n"
        result_text += "lg(10) = 1\n"
        result_text += "lg(100) = 2\n"
        result_text += "lg(1000) = 3\n\n"
        result_text += "自然对数值:\n"
        result_text += "ln(1) = 0\n"
        result_text += "ln(e) = 1\n"
        result_text += "ln(e&#178;) = 2\n"
        
        self.update_result(result_text)
        self.update_status("显示对数函数信息")
        
        # 更新其他结果框
        self.other_result.delete(1.0, tk.END)
        self.other_result.insert(tk.END, result_text)
    
    def show_pi(self):
        """显示圆周率"""
        result_text = "圆周率 π\n\n"
        result_text += f"π ≈ 3.14159265358979323846\n\n"
        result_text += "与π相关的公式:\n"
        result_text += "圆的周长:C = 2πr\n"
        result_text += "圆的面积:S = πr&#178;\n"
        result_text += "球体积:V = (4/3)πr&#179;\n"
        result_text += "球表面积:S = 4πr&#178;\n"
        result_text += "扇形弧长:L = (n°/360°)×2πr\n"
        result_text += "扇形面积:S = (n°/360°)×πr&#178;\n"
        
        self.update_result(result_text)
        self.update_status("显示圆周率π的信息")
        
        # 更新其他结果框
        self.other_result.delete(1.0, tk.END)
        self.other_result.insert(tk.END, result_text)
    
    def show_e(self):
        """显示自然常数"""
        result_text = "自然常数 e\n\n"
        result_text += f"e ≈ 2.71828182845904523536\n\n"
        result_text += "e的性质:\n"
        result_text += "&#8226; e是自然对数的底数\n"
        result_text += "&#8226; 在复利计算中经常出现\n"
        result_text += "&#8226; 指数函数e^x的导数等于它自身\n"
        result_text += "&#8226; 欧拉公式:e^(iπ) + 1 = 0\n\n"
        result_text += "e的计算:\n"
        result_text += "e = lim(1 + 1/n)^n  (n→∞)\n"
        result_text += "e = 1 + 1/1! + 1/2! + 1/3! + ..."
        
        self.update_result(result_text)
        self.update_status("显示自然常数e的信息")
        
        # 更新其他结果框
        self.other_result.delete(1.0, tk.END)
        self.other_result.insert(tk.END, result_text)
    
    def calculate_mean(self):
        """计算平均值"""
        result_text = "平均值计算\n\n"
        result_text += "算术平均数:mean = (x&#8321; + x&#8322; + ... + x&#8345;) / n\n"
        result_text += "几何平均数:G = &#8319;√(x&#8321; × x&#8322; × ... × x&#8345;)\n"
        result_text += "加权平均数:加权平均 = Σ(权重×数值)/Σ权重\n\n"
        result_text += "示例:\n"
        result_text += "数据:85, 90, 78, 92, 88\n"
        result_text += "平均数 = (85+90+78+92+88)/5 = 86.6"
        
        self.update_result(result_text)
        self.update_status("显示平均值计算方法")
        
        # 更新其他结果框
        self.other_result.delete(1.0, tk.END)
        self.other_result.insert(tk.END, result_text)
    
    def calculate_variance(self):
        """计算方差"""
        result_text = "方差和标准差\n\n"
        result_text += "方差:衡量数据的离散程度\n"
        result_text += "方差公式:σ&#178; = Σ(x&#7522; - μ)&#178; / n\n"
        result_text += "标准差:σ = √方差\n\n"
        result_text += "示例:\n"
        result_text += "数据:85, 90, 78, 92, 88\n"
        result_text += "平均数 μ = 86.6\n"
        result_text += "方差 σ&#178; = [(85-86.6)&#178;+(90-86.6)&#178;+...]/5 ≈ 28.24\n"
        result_text += "标准差 σ = √28.24 ≈ 5.31"
        
        self.update_result(result_text)
        self.update_status("显示方差和标准差计算方法")
        
        # 更新其他结果框
        self.other_result.delete(1.0, tk.END)
        self.other_result.insert(tk.END, result_text)

def main():
    root = tk.Tk()
    
    # 设置窗口图标和居中
    try:
        root.iconbitmap(default='math.ico')
    except:
        pass
    
    window_width = 1100
    window_height = 750
    screen_width = root.winfo_screenwidth()
    screen_height = root.winfo_screenheight()
    x = (screen_width - window_width) // 2
    y = (screen_height - window_height) // 2
    root.geometry(f'{window_width}x{window_height}+{x}+{y}')
    
    # 创建应用
    app = MathHelper(root)
    
    root.mainloop()

if __name__ == "__main__":
    main()

软件界面.png (231.41 KB, 下载次数: 2)

软件界面

软件界面

免费评分

参与人数 2吾爱币 +8 热心值 +2 收起 理由
huran + 1 + 1 我很赞同!
风之暇想 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
34000920 发表于 2026-4-26 21:03
这个可以,下载给小孩试试
3#
 楼主| xhlbudd 发表于 2026-4-26 23:08 |楼主
34000920 发表于 2026-4-26 21:03
这个可以,下载给小孩试试

谢谢支持,也可以让孩子以此为基础,开始学习Python~~
4#
hnlctt 发表于 2026-4-27 08:37
5#
dabodb 发表于 2026-4-27 10:41
谢谢分享,希望能帮到小孩
6#
lrat 发表于 2026-4-27 10:56
给小孩试试,看着不错呦
7#
Ice20191212 发表于 2026-4-27 11:36
这个工具还挺好
8#
浓茶 发表于 2026-4-28 08:55
实用的小工具
9#
katapy 发表于 2026-4-28 09:04
学习数学,最好的方式不是去领悟练习嘛
10#
emcell 发表于 2026-4-28 11:51
这个工能有点少
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-4-29 12:01

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表