[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 = "²"
elif power == 3:
operation = "立方"
symbol = "³"
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 = "³√"
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² + {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² + {b}x + {c} = 0\n\n"
# 计算判别式
delta = b**2 - 4*a*c
result_text += f"判别式 Δ = b² - 4ac = {b}² - 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₁ = (-b + √Δ)/(2a) = ({-b} + √{delta})/({2*a}) = {x1:.4f}\n"
result_text += f"x₂ = (-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₁ = x₂ = -b/(2a) = {-b}/({2*a}) = {x:.4f}\n\n"
result_text += f"方程可分解为:{a}(x - {x:.4f})² = 0"
else:
# 两个共轭虚根
real_part = -b / (2*a)
imag_part = math.sqrt(-delta) / (2*a)
result_text += f"Δ < 0,方程有两个共轭虚根:\n"
result_text += f"x₁ = {real_part:.4f} + {imag_part:.4f}i\n"
result_text += f"x₂ = {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₁₀x 或 lgx\n"
result_text += "自然对数:logₑ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²) = 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²\n"
result_text += "球体积:V = (4/3)πr³\n"
result_text += "球表面积:S = 4πr²\n"
result_text += "扇形弧长:L = (n°/360°)×2πr\n"
result_text += "扇形面积:S = (n°/360°)×πr²\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 += "• e是自然对数的底数\n"
result_text += "• 在复利计算中经常出现\n"
result_text += "• 指数函数e^x的导数等于它自身\n"
result_text += "• 欧拉公式: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₁ + x₂ + ... + xₙ) / n\n"
result_text += "几何平均数:G = ⁿ√(x₁ × x₂ × ... × xₙ)\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 += "方差公式:σ² = Σ(xᵢ - μ)² / n\n"
result_text += "标准差:σ = √方差\n\n"
result_text += "示例:\n"
result_text += "数据:85, 90, 78, 92, 88\n"
result_text += "平均数 μ = 86.6\n"
result_text += "方差 σ² = [(85-86.6)²+(90-86.6)²+...]/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()