PyQt5中机器号与线号输入异常未触发问题求助
排查PyQt5零件编号生成程序中机器号/线号范围校验异常失效问题
我来帮你搞定这个问题!机器号和线号的范围校验没触发异常,大概率是校验逻辑的实现出了问题——要么是范围判断写得不对,要么是校验后没正确抛出异常,甚至可能这段校验代码根本没在Generate按钮的触发流程里执行。
常见问题分析
先梳理下可能的几个核心原因:
- 你可能只做了输入转整数的操作,但漏掉了0-99的范围判断,或者判断条件写反/写错(比如只判断了
>99却没处理<0的情况) - 范围判断后没有抛出异常,或者抛出的异常类型没被后续错误处理逻辑捕获
- 校验代码的位置不对,没在Generate按钮的槽函数里执行,等于白写
修复方案与完整代码示例
假设你的原始代码存在上述典型问题,下面是修复后的可直接运行代码,我会标注关键修改点:
import sys import re from PyQt5.QtWidgets import (QApplication, QDialog, QLabel, QLineEdit, QPushButton, QVBoxLayout, QMessageBox) import openpyxl from pathlib import Path class PartNumberGenerator(QDialog): def __init__(self): super().__init__() self.init_ui() def init_ui(self): # 初始化UI组件 self.ntid_label = QLabel("NTID (UUUNUUU):") self.ntid_input = QLineEdit() self.machine_label = QLabel("Machine Number (0-99):") self.machine_input = QLineEdit() self.line_label = QLabel("Line Number (0-99):") self.line_input = QLineEdit() self.part_type_label = QLabel("Part Type:") self.part_type_input = QLineEdit() self.generate_btn = QPushButton("Generate") self.generate_btn.clicked.connect(self.generate_part_number) # 布局设置 layout = QVBoxLayout() layout.addWidget(self.ntid_label) layout.addWidget(self.ntid_input) layout.addWidget(self.machine_label) layout.addWidget(self.machine_input) layout.addWidget(self.line_label) layout.addWidget(self.line_input) layout.addWidget(self.part_type_label) layout.addWidget(self.part_type_input) layout.addWidget(self.generate_btn) self.setLayout(layout) self.setWindowTitle("Part Number Generator") def validate_inputs(self): """集中处理所有输入校验逻辑""" # NTID格式校验 ntid = self.ntid_input.text().strip() ntid_pattern = r'^[A-Z]{3}\d[A-Z]{3}$' if not re.match(ntid_pattern, ntid): raise ValueError("NTID格式错误!必须是UUUNUUU格式(U为大写字母,N为数字)") # 机器号校验:先转整数,再判断范围 try: machine_num = int(self.machine_input.text().strip()) except ValueError: raise ValueError("机器号必须是整数!") if machine_num < 0 or machine_num > 99: raise ValueError("机器号必须在0-99范围内!") # 线号校验:同机器号逻辑 try: line_num = int(self.line_input.text().strip()) except ValueError: raise ValueError("线号必须是整数!") if line_num < 0 or line_num > 99: raise ValueError("线号必须在0-99范围内!") # 零件类型非空校验 part_type = self.part_type_input.text().strip() if not part_type: raise ValueError("零件类型不能为空!") return ntid, machine_num, line_num, part_type def generate_part_number(self): """Generate按钮的槽函数,处理核心逻辑""" try: # 先执行所有输入校验,校验不通过直接抛出异常 ntid, machine_num, line_num, part_type = self.validate_inputs() # 生成零件编号(格式可根据需求调整) part_number = f"{part_type}-{machine_num:02d}-{line_num:02d}-{ntid}" # 写入Excel文件 excel_path = Path("Master Part Sheet.xlsx") if excel_path.exists(): wb = openpyxl.load_workbook(excel_path) else: wb = openpyxl.Workbook() ws = wb.active ws.append(["NTID", "Machine Number", "Line Number", "Part Type", "Part Number"]) ws = wb.active ws.append([ntid, machine_num, line_num, part_type, part_number]) wb.save(excel_path) QMessageBox.information(self, "成功", f"零件编号已生成:{part_number}\n已保存到Excel文件") except ValueError as ve: # 捕获所有输入校验异常,弹出提示 QMessageBox.warning(self, "输入错误", str(ve)) except PermissionError: QMessageBox.critical(self, "权限错误", "无法写入Excel文件,请确保文件未被其他程序打开!") except Exception as e: QMessageBox.critical(self, "未知错误", f"发生错误:{str(e)}") if __name__ == "__main__": app = QApplication(sys.argv) dialog = PartNumberGenerator() dialog.show() sys.exit(app.exec_())
关键修改点说明
- 独立校验函数:把所有输入校验逻辑放到
validate_inputs函数里,集中管理,便于后续修改维护。 - 完整的机器号/线号校验:
- 先尝试将输入转换为整数,捕获非数字输入的异常
- 转换成功后,严格判断是否在0-99范围内,不符合则抛出明确的
ValueError
- 统一异常处理:在
generate_part_number的try-except块中,专门捕获ValueError并弹出提示,确保所有输入错误都能被拦截,不会让程序继续执行。
测试验证
你可以测试以下场景验证修复效果:
- 机器号输入
100或-5,会弹出“机器号必须在0-99范围内!”的提示 - 线号输入非数字(比如
abc),会弹出“线号必须是整数!”的提示 - NTID格式错误(比如
AAA1AA),会正常触发格式错误提示
这样应该就能解决你遇到的机器号、线号范围校验异常失效的问题了。
内容的提问来源于stack exchange,提问作者Ashish Rao M
相关产品推荐
相关产品推荐

