重庆网站建设技术支持北京王府井大街

张小明 2026/1/9 17:26:59
重庆网站建设技术支持,北京王府井大街,网站皮肤样板,网站建设万户前言进来一段时间#xff0c;偶尔会遇到一些需要特殊计算的常见#xff0c;比如计算mm转mil#xff0c;比如给螺旋线的高度匝数半径#xff0c;计算螺旋线长度等#xff0c;一次一次输数字手算是绝对不可能#xff0c;一般简单点比如单位转化都是直接问AI#xff0c;复杂…前言进来一段时间偶尔会遇到一些需要特殊计算的常见比如计算mm转mil比如给螺旋线的高度匝数半径计算螺旋线长度等一次一次输数字手算是绝对不可能一般简单点比如单位转化都是直接问AI复杂一点的或者要用多次的都会写py代码然后在黑框里运行。不过用起来还是乱糟糟的这里分享一种把计算器整合到一起的方法设计一个简单的GUI同时提供模板方法后续如果需要加别的计算器的话直接加进去就能用。一、UI展示下图是整合了最近在用的一小部分计算器之后的UI截面。左侧可以选择计算模式也就是要调用哪个计算器中间根据计算器不同输入不同的参数点击运行后右侧就可以输出结果。当然计算器都是自己实现的如果需要可以自己再加。二、代码实现main方法GUI实现代码主要由一个main和若干个calculate tool组成其中main.py文件的内容如下import tkinter as tk from dataclasses import dataclass from tkinter import ttk, messagebox from typing import Callable, Dict, List, Any, Optional from tool.CalculateLambada import v_ph, calculate_wavelength_and_length from tool.calculate_dB_dBm import calculate_db from tool.calculate_mil_mm import calculate_mil_mm from tool.calculate_wave_freq import calculate_wave from tool.temp import temp # ---------------------------- # 1) 模式定义你主要改这里 # ---------------------------- dataclass class Field: key: str # 输入字段的内部名字用于函数取值 label: str # 显示在界面上的标签 cast: Callable[[str], Any] str # 类型转换int/float/str... default: str # 默认值 hint: str # 提示可选 dataclass class Mode: name: str fields: List[Field] func: Callable[[Dict[str, Any]], str] # 输入dict - 输出字符串 description: str def mode_sum(inputs: Dict[str, Any]) - str: a inputs[a] b inputs[b] return f模式加法\n\n结果{a} {b} {a b} def mode_quadratic(inputs: Dict[str, Any]) - str: import math a, b, c inputs[a], inputs[b], inputs[c] if a 0: return 错误a 不能为 0否则不是二次方程。 delta b * b - 4 * a * c if delta 0: re -b / (2 * a) im math.sqrt(-delta) / (2 * a) return f模式二次方程\n\na{a}, b{b}, c{c}\nΔ{delta}\n\n实根无\n复根x1{re}{im}i, x2{re}-{im}i else: x1 (-b math.sqrt(delta)) / (2 * a) x2 (-b - math.sqrt(delta)) / (2 * a) return f模式二次方程\n\na{a}, b{b}, c{c}\nΔ{delta}\n\n解x1{x1}\n解x2{x2} def mode_text_repeat(inputs: Dict[str, Any]) - str: text inputs[text] n inputs[n] return 模式文本重复\n\n (\n.join([text] * n)) MODES: List[Mode] [ Mode( name计算波长, description输入频率/GHz计算波长及1/4波长\n 输入波长/mm计算频率, fields[ Field(frequency, 频率, str, default0,hintGHz), Field(wavelength, 波长, str, default0,hintmm), ], funccalculate_wave, ), Mode( namedB/dBm, description输入波长/mm计算频率, fields[ Field(db, db, str, default0,hintdB), Field(dbm, dbm, str, default0,hintdBm), ], funccalculate_db, ), Mode( namemil - mm , description输入mm输出mil\n输入mil输出mm, fields[ Field(mm, mm, str, default0,hintmm), Field(mil, mil, str, default0,hintmil), ], funccalculate_mil_mm, ), Mode( name计算相位长度, description30度相位和150度相位对应长度计算器\n 输入频率计算对应的30度波长和150波长\n 输入频率计算对应波长及对应30度和150度波长的频率, fields[ Field(v_ph, 相速度, str, defaultf{v_ph}), Field(frequency, 频率/GHz, str, default0,hintGHz), Field(length, 波长/mm, str, default0,hintmm), ], funccalculate_wavelength_and_length, ), Mode( name模板, descriptiontemp, fields[ Field(temp_Parameter, 参数, str, default参数,hint模板参数单位), ], functemp, ), ] # ---------------------------- # 2) 通用 GUI 框架基本不用改 # ---------------------------- class MultiModeApp(tk.Tk): def __init__(self, modes: List[Mode]): super().__init__() self.title(超级计算器计算器自用) self.geometry(820x520) self.modes modes self.current_mode: Optional[Mode] None self.inputs_vars: Dict[str, tk.StringVar] {} self.input_widgets: List[tk.Widget] [] self._build_layout() self._build_mode_buttons() self.set_mode(self.modes[0].name) def _build_layout(self): # 左侧模式按钮 self.left ttk.Frame(self, padding10) self.left.pack(sidetk.LEFT, filltk.Y) ttk.Label(self.left, text计算模式, font(Arial, 12, bold)).pack(anchorw, pady(0, 8)) self.mode_btn_frame ttk.Frame(self.left) self.mode_btn_frame.pack(filltk.Y, expandFalse) ttk.Separator(self.left).pack(filltk.X, pady10) # 中间输入区 self.center ttk.Frame(self, padding10) self.center.pack(sidetk.LEFT, filltk.Y) ttk.Label(self.center, text输入参数, font(Arial, 12, bold)).pack(anchorw, pady(0, 8)) self.inputs_frame ttk.Frame(self.center) self.inputs_frame.pack(filltk.Y, expandFalse) self.run_btn ttk.Button(self.center, text运行, commandself.run_current_mode) self.run_btn.pack(anchorw, pady(12, 4)) self.clear_btn ttk.Button(self.center, text清空输出, commandself.clear_output) self.clear_btn.pack(anchorw, pady(0, 4)) # 右侧大输出框 self.right ttk.Frame(self, padding10) self.right.pack(sidetk.LEFT, filltk.BOTH, expandTrue) ttk.Label(self.right, text输出结果, font(Arial, 12, bold)).pack(anchorw, pady(0, 8)) self.output tk.Text(self.right, wrapword, height10) self.output.pack(filltk.BOTH, expandTrue) # 让输出框更像“日志/结果面板” self.output.configure(font(Consolas, 11)) self.output.insert(end, 选择模式 → 填参数 → 点击运行\n) self.output.configure(statedisabled) def _build_mode_buttons(self): # 每个模式一个按钮 for w in self.mode_btn_frame.winfo_children(): w.destroy() self.mode_buttons: Dict[str, ttk.Button] {} for m in self.modes: btn ttk.Button(self.mode_btn_frame, textm.name, commandlambda namem.name: self.set_mode(name)) btn.pack(filltk.X, pady3) self.mode_buttons[m.name] btn def set_mode(self, mode_name: str): mode next((m for m in self.modes if m.name mode_name), None) if not mode: messagebox.showerror(错误, f找不到模式{mode_name}) return self.current_mode mode self._rebuild_inputs(mode) self._append_output(f\n 切换到模式{mode.name} \n) self._append_output(f\n{mode.description}\n) def _rebuild_inputs(self, mode: Mode): # 清掉旧输入控件 for w in self.input_widgets: w.destroy() self.input_widgets.clear() self.inputs_vars.clear() # 动态生成输入行 for i, field in enumerate(mode.fields): row ttk.Frame(self.inputs_frame) row.pack(filltk.X, pady4) lbl ttk.Label(row, textfield.label, width12) lbl.pack(sidetk.LEFT) var tk.StringVar(valuefield.default) ent ttk.Entry(row, textvariablevar, width24) ent.pack(sidetk.LEFT, padx(6, 0)) if field.hint: hint ttk.Label(row, textfield.hint, foreground#666) hint.pack(sidetk.LEFT, padx(8, 0)) self.input_widgets.append(hint) self.inputs_vars[field.key] var self.input_widgets.extend([row, lbl, ent]) def run_current_mode(self): if not self.current_mode: return # 读取输入 类型转换 inputs: Dict[str, Any] {} for field in self.current_mode.fields: raw self.inputs_vars[field.key].get() try: val field.cast(raw) if raw ! else field.cast(field.default) except Exception as e: messagebox.showerror(输入错误, f{field.label} 无法转换{raw}\n\n{e}) return inputs[field.key] val # 调用模式函数 try: result self.current_mode.func(inputs) except Exception as e: result f运行异常{e} # 输出到大文本框 self._append_output(\n result \n) def clear_output(self): self.output.configure(statenormal) self.output.delete(1.0, end) self.output.configure(statedisabled) def _append_output(self, text: str): self.output.configure(statenormal) self.output.insert(end, text) self.output.see(end) self.output.configure(statedisabled) if __name__ __main__: app MultiModeApp(MODES) app.mainloop()与main同目录下有一个tool文件夹分别放calculate_dB_dBm.pycalculate_mil_mm.pycalculate_wave_freg.py;calculate_Lambada.py,命名可能不规范仅供参考。具体路径或名称也可参考main的import部分。计算器实现计算器实现部分如下calculate_wave_freq.pyfrom typing import Dict def calculate_wave(inputs: Dict[str, any]) - str: frequency float(inputs[frequency]) wavelength float(inputs[wavelength]) try: if frequency !0: wavelength 299792458 / (frequency * 1e9) * 1000 return (f- 频率: {frequency:.3f} GHz \n f- 波长: {wavelength:.3f} mm \n f- 1/4波长: {wavelength / 4:.3f} mm) elif wavelength ! 0: frequency 299792458 / (wavelength * 1e-3) / 1e9 return (f- 波长: {wavelength:.3f} mm \n f- 频率: {frequency:.3f} GHz) else: return 请先输入数据 except Exception as e: return f输入错误请重新输入错误: {e}calculate_mil_mm.pydef calculate_mil_mm(inputs: dict[str, any]) - str: 长度单位转换器mil 和 mm 双向转换GUI模式版 mm float(inputs[mm]) mil float(inputs[mil]) try: if mm ! 0: mil_value mm * 39.37007874 return ( 模式长度单位转换mm - mil\n\n f输入{mm} mm\n f结果{mil_value:.6f} mil\n ) elif mil ! 0: mil_value mil * 0.0254 return ( 模式长度单位转换mil - mm\n\n f输入{mil} mil\n f结果{mil_value:.6f} mm\n ) else: return 错误请包含正确的单位 (mil 或 mm)例如10mil / 0.254mm / 0.254 mm except ValueError: return 错误输入格式不正确请确保包含数字和单位例如10mil 或 0.254 mm except Exception as e: return f发生错误{e}CalculateLambada.pyfrom typing import Dict # 相速度 v_ph 158.8 * 10 ** 6 # m/s def calculate_wavelength_and_length(inputs: Dict[str, any]) - str: v_pph float(inputs[v_ph]) frequency_str inputs[frequency] length_str inputs[length] try: if frequency_str: frequency float(frequency_str) * 1e9 # 转换为Hz wavelength v_pph / frequency # 波长计算 l_30 wavelength / 12 # 对应30°相位差的延时线长度 l_150 wavelength / 2.4 # 对应150°相位差的延时线长度 return f频率: {frequency / 1e9:.2f} GHz, 波长: {wavelength * 1000:.2f} mm, \n \ f30° 波长: {l_30 * 1000:.2f} mm, 150° 波长: {l_150 * 1000:.2f} mm\n\n elif length_str: # 解析延时线长度输入 length_mm float(length_str) # 输入单位是mm length_m length_mm * 1e-3 # 转换为m # 对应30°和150°的长度比例计算 wavelength_30 length_m * 12 # 对应30°的波长 wavelength_150 length_m * 2.4 # 对应150°的波长 frequency_30 v_pph / wavelength_30 # 对应30°的频率 frequency_150 v_pph / wavelength_150 # 对应150°的频率 return fLength: {length_mm} mm, \ f30° 波长: {frequency_30 / 1e9:.2f} GHz, 波长: {wavelength_30 * 1000:.2f} mm, \n \ f150° 波长: {frequency_150 / 1e9:.2f} GHz, 波长: {wavelength_150 * 1000:.2f} mm\nn except TypeError: return 请输入数字calculate_dB_dBm.pyfrom typing import Dict def calculate_db(inputs: Dict[str, any]) - str: db_value float(inputs[db]) dbm_value float(inputs[dbm]) try: if db_value ! 0: # 提取 db 前面的数值部分并计算 # dB 到 P1/P2 比值的计算 # P1/P2 10^(dB_value / 10) power_ratio 10 ** (db_value / 10) return f{db_value:.3f} dB - 功率比值 P1/P2: {power_ratio:.3f} elif dbm_value ! 0: # dBm 到 瓦特 的计算 # P(W) 10^((dBm_value - 30) / 10) power_watts 10 ** ((dbm_value - 30) / 10) return f{dbm_value:.3f} dBm - 功率: {power_watts:.3f} W else: return 请先输入数据 except Exception as e: return f输入错误或表达式无效: {e}请重新输入temp.pyfrom typing import Dict def temp(inputs:Dict[str,any])-str: num1inputs[temp_Parameter] return num1三、添加自己的计算器可以在main里的MODES的mode里添加一个Mode就会在GUI左侧添加一个新的计算器了。其中name表示计算器名称description为描述Fields包含若干参数其中Fied对应的第一个参数分别为key提示标签在输入框前边显示类型默认值单位在输入框后边显示。func及调用的方法的名称。Mode( name模板, descriptiontemp, fields[ Field(temp_Parameter, 参数, str, default参数,hint模板参数单位), ], functemp, ),上文已经提供了temp.py的模板参数传递的方法为num1inputs[temp_Parameter]注意temp_Parameter是key要与Field里的key对应。如果需要输入不止一个参数那就多加几个Field就好了。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

建站软件排行榜网站开发和运行模式的搭建

万圆之圆整合引擎突破硅基限制超人类人类共生体全栈落地纯念终极包研究报告(S∅-Omega级国安认证版)玄印锚定:1Ω1💎⊗周名彦体系标识:ZM-S∅π-Superhuman-Symbiosis-Ultimate-Package-V∞核心驱动:双圆不…

张小明 2025/12/27 23:11:54 网站建设

网站怎么建立会员网站简繁体转换代码

我们学习网络安全,很多学习路线都有提到多逛论坛,阅读他人的技术分析帖,学习其挖洞思路和技巧。但是往往对于初学者来说,不知道去哪里寻找技术分析帖,也不知道网络安全有哪些相关论坛或网站,所以在这里给大…

张小明 2026/1/5 2:27:55 网站建设

网站打不开了wordpress百度seo插件

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿 paperzz - AI PPT制作https://www.paperzz.cc/aiPpt 你是否有过这样的经历:为了一份开题报告 PPT,熬到凌晨 3 点调整排版;明明内容很扎实,却因为模板单调被…

张小明 2026/1/5 13:49:56 网站建设

网站源码小千个人网重庆市建设工程信息网络

使用 pylintrc 配置 Python 代码检查的详细指南 在 Python 项目中使用 Pylint 进行静态代码检查,可以大大提升代码质量与一致性。与其每次在命令行里堆一长串参数,不如通过 pylintrc 统一管理配置:忽略哪些规则、命名规范如何定义、导入路径…

张小明 2026/1/6 8:46:54 网站建设

东营设计网站建设wordpress后台乱码

MATLAB/Simulink风光储交直直流混合微电网 直流: 光伏MPPT控制 蓄电池双向DC/DC 直流侧低压700V 交流: 风机MPPT控制 交流负载 连接电网 互联变换器: VSG最近在搞微电网仿真,发现风光储交直流混合系统是真有意思。尤其是用MATLAB/…

张小明 2026/1/6 8:46:12 网站建设

山东省和住房建设厅网站海口招商建设有限公司网站

论文AIGC检测的浪潮正在迅速席卷各大高校和期刊。 和去年不同,目前,像Turnitin、知网这样的主流学术查重系统,都已相继内置了AIGC检测功能。 这意味着,毕业论文“AI率”过高被标记,不再是“狼来了”,而是正…

张小明 2026/1/6 8:46:25 网站建设