累计签到:16 天 连续签到:3 天
|
迩来在教舅舅家上初二的儿子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 tkfrom tkinter import ttk, scrolledtext, messageboximport mathimport sympyimport numpy as npfrom PIL import Image, ImageTk, ImageDraw, ImageFontimport matplotlib.pyplot as pltfrom matplotlib.backends.backend_tkagg import FigureCanvasTkAggimport matplotlibmatplotlib.use('Agg')import pygameimport threadingimport osdef 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 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 |
精密测量技术论坛免责声明
✈️重要声明:以上内容仅代表该作者观点,不代表本站精密测量技术论坛立场。
✅如有涉及侵权请尽快告知,我们将会在第一时间处理。作者原创内容未经允许不得转载!
📱 站长联系邮箱:1339305021@qq.com
📱 站长联系微信:dddnnbbb
|