You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_())

关键修改点说明

  1. 独立校验函数:把所有输入校验逻辑放到validate_inputs函数里,集中管理,便于后续修改维护。
  2. 完整的机器号/线号校验:
    • 先尝试将输入转换为整数,捕获非数字输入的异常
    • 转换成功后,严格判断是否在0-99范围内,不符合则抛出明确的ValueError
  3. 统一异常处理:在generate_part_number的try-except块中,专门捕获ValueError并弹出提示,确保所有输入错误都能被拦截,不会让程序继续执行。

测试验证

你可以测试以下场景验证修复效果:

  • 机器号输入100或-5,会弹出“机器号必须在0-99范围内!”的提示
  • 线号输入非数字(比如abc),会弹出“线号必须是整数!”的提示
  • NTID格式错误(比如AAA1AA),会正常触发格式错误提示

这样应该就能解决你遇到的机器号、线号范围校验异常失效的问题了。

内容的提问来源于stack exchange,提问作者Ashish Rao M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:59:21