如何修复带range的for循环:错误时停留在当前统计项重新输入
问题修复:怪物卡牌统计项输入校验循环问题
核心问题分析
input_stat_error函数逻辑失效:内部while True循环未执行实际循环逻辑,且固定返回None,导致外层flag is True的判断永远不成立,错误输入后直接跳出内层循环,跳至下一个统计项。- 输入转换未做异常处理:直接执行
int(e.enterbox(...)),若用户输入非数字会直接触发程序报错中断。
修复方案
1. 重构校验函数
修改input_stat_error,让它真正返回校验结果,处理数值范围和类型错误:
# 校验统计值是否为1-25之间的有效数字 def input_stat_error(input_val): try: num = int(input_val) if 1 <= num <= 25: return False # 校验通过,无错误 else: e.msgbox("数值需在1-25之间,请重新输入", "错误") return True except ValueError: e.msgbox("输入无效,请输入数字", "错误") return True
2. 调整输入循环逻辑
保留原range(4)的for循环,在内层循环中先获取原始输入、校验,通过后再转换存储:
# 保留原range循环结构 x = range(4) for n in x: while True: # 先获取原始输入,不直接强转int input_str = e.enterbox(f"输入{stats[n]}的数值(1-25)", f"设置{stats[n]}属性") # 调用校验函数判断是否有效 if input_stat_error(input_str): continue # 校验失败,重新输入当前项 # 校验通过后转换并存储 stat_val = int(input_str) stats_names[n] = stat_val monster_cards[name][stats[n]] = str(stat_val) # 和原有字典字符串格式保持一致 break # 进入下一个统计项
3. 额外细节优化
- 原字典中统计值为字符串类型,修复后存储时统一转为字符串,保持数据格式一致性。
- 移除原代码中无效的
stats_names变量赋值冗余逻辑,保留原有变量结构的同时简化流程。
修复后效果
输入错误时,程序会停留在当前统计项的输入环节,直到用户输入符合要求的数值,才会进入下一个统计项,完全保留了原range(4)的循环结构。
内容的提问来源于stack exchange,提问作者TroyE
相关产品推荐
相关产品推荐

