
本文介绍在python命令行辐射剂量计算程序中,如何用简单键入指令(如"reset"或"quit")实时中断计算循环,无缝跳转回dtu型号与参数输入环节,无需依赖复杂gui或多线程。
在您的辐射剂量计算脚本中,while True: 循环持续等待 I1 和 I2 输入并执行公式迭代更新参数 a、b,但缺乏用户主动退出或重置的入口——这正是键盘事件介入的核心场景。值得注意的是:此处“键盘事件”并非指监听任意按键(如 keyboard.is_pressed()),而是利用 input() 的阻塞特性,通过约定特殊字符串指令实现轻量级控制流切换。该方案兼容性强、零依赖、无竞态风险,远比引入 keyboard 库监听全局按键更安全可靠(尤其在 Windows 终端或远程 SSH 环境下,keyboard 常因权限/兼容性问题静默失效)。
以下是推荐的结构化改造方案,分两层中断逻辑:
✅ 第一层:退出整个程序(quit)
在首次选择 DTU 编号后、进入 KdrDf 参数输入前,捕获 "quit" 指令:
# 替换原代码中这一段:
dtu = int(input("Номер ДТУ = "))
# 改为:
while True:
dtu_input = input("Номер ДТУ = ").strip()
if dtu_input.lower() == "quit":
print("Выход из программы.")
exit(0)
try:
dtu = int(dtu_input)
if dtu in (1, 2, 3):
break
else:
print("Ошибка: введите 1, 2 или 3.")
except ValueError:
print("Ошибка: введите число.")✅ 第二层:重置当前 DTU 并重新输入参数(reset)
将原单层 while True: 计算循环升级为外层参数循环 + 内层测量循环,并在关键 input() 处插入指令判断:
# KdrDf(start) —— 外层:固定 DTU 后的参数配置循环
while True:
n_input = input("K_group = ").strip()
if n_input.lower() == "reset":
break # 跳出内层,回到 DTU 选择
if n_input.lower() == "quit":
print("Выход из программы.")
exit(0)
try:
n = int(n_input)
if 0 <= n < len(k): # 防越界
ks = k[n]
else:
print(f"Ошибка: K_group должен быть от 0 до {len(k)-1}.")
continue
except ValueError:
print("Ошибка: K_group должно быть числом.")
continue
k_dr = float(input('K_dreif = '))
dfon = float(input("Dfon = "))
# 测量值输入循环(内层)
while True:
i1_str = input("I1 = ").strip()
if i1_str.lower() == "reset":
break # 跳出内层,回到 K_group 输入
if i1_str.lower() == "quit":
exit(0)
i2_str = input("I2 = ").strip()
if i2_str.lower() == "reset":
break
if i2_str.lower() == "quit":
exit(0)
# 正常数值处理(保留您原有的逗号转小数逻辑)
i1_str = i1_str.replace(',', '.')
i2_str = i2_str.replace(',', '.')
try:
i_1, i_2 = float(i1_str), float(i2_str)
except ValueError:
print("Ошибка: введите корректные числа.")
continue
# 后续计算逻辑(保持不变)...
i1, i2 = i_1 * ks, i_2 * ks
d1 = (k_dr * i1 * a) + b
d2 = (k_dr * i2 * a) + b
D = ((d1 + d2) / 2) - dfon
if 1.5 <= D < 15:
a, b = a_m[1], b_m[1]
# ... 重算 D 并输出黄色
elif D >= 15:
a, b = a_m[2], b_m[2]
# ... 重算 D 并输出红色
else:
# ... 输出绿色⚠️ 注意事项与最佳实践
- 指令大小写不敏感:使用 .lower() 统一处理,提升用户体验;
- 输入校验必须前置:在 int()/float() 转换前先检查指令,避免 ValueError 中断流程;
- 避免 keyboard 库陷阱:您代码中已导入 keyboard,但 input() 期间其 is_pressed() 通常无法响应(因 input() 占用 stdin)。若坚持用物理按键(如 Esc),需改用 threading + keyboard.read_key(),但会显著增加复杂度与跨平台风险;
- 用户体验优化:可在提示符中注明可用指令,例如 I1 = (введите число или 'reset' для сброса параметров);
- JSON 数据健壮性:建议对 data[dtu] 键存在性做 try/except,防止配置文件缺失字段导致崩溃。
通过以上改造,用户只需在任意输入环节键入 reset,即可立即跳出当前计算上下文,逐级返回至 DTU 选择界面;键入 quit 则彻底退出程序。整个过程逻辑清晰、无状态泄漏、完全符合命令行交互直觉,是科学计算类脚本中推荐的标准实践。










