输入验证及其改进方法

时间:2019-04-10 21:05:15

标签: python-3.x error-handling

我已经组合了一个用于输入验证的函数(当前未使用try / except块)。

它可以工作,但是错误纠正会带来奇怪的行为……也就是说,一旦用户纠正了错误,他们就必须按两次计算按钮才能正确触发该错误?

def validation(self):

    partval = self.partDiaText.text()
    partlentext = self.partLenText.text()
    matdia = self.matDiaText.text()

    if partval.isalpha():
        self.error_label.setText("The part diameter must be a number!")
        self.partDiaText.setText("")

    elif partval == 0:
        self.error_label.setText("The part diameter must be greater than zero!")

    elif partlentext.isalpha():
        self.partLenText.setText("")
        self.error_label.setText("The part length must be a number!")

    elif partlentext == 0:
        self.error_label.setText("The part length must be greater than zero!")

    elif matdia.isalpha():
        self.matDiaText.setText("")
        self.error_label.setText("The material diameter must be a number!")

    elif matdia == 0:
        self.error_label.setText("The material diameter must be greater than zero!")


    else:
        self.error_label.clear()
        self.pushButton_2.clicked.connect(self.reset_output)
        self.pushButton_2.clicked.connect(self.calc_machining)
        self.pushButton_2.clicked.connect(self.calc_times)
        self.pushButton_2.clicked.connect(self.calc_qtyVar)
        self.pushButton_2.clicked.connect(self.work_centre)
        self.pushButton_2.clicked.connect(self.material_code)

编辑:即使没有错误,我仍然必须按两次pushbutton_2才能使clicked.connects触发。如果我将所有clicked.connects都从验证功能中取出,并将它们放入主init函数中,则它将正确触发,但输入上没有任何验证。

1 个答案:

答案 0 :(得分:1)

我的猜测是,正如@noidsirius所暗示的那样,您第一次使用clic时,将执行验证并将clic连接到插槽。插槽确实是第二次执行。

如果此猜测正确,则可能的解决方案是:


def __init__(self):
    self.pushButton_2.clicked.connect(self.validate_and_run_if_ok)
    # etc.

def validate_and_run_if_ok(self):

    partval = self.partDiaText.text()
    partlentext = self.partLenText.text()
    matdia = self.matDiaText.text()

    if partval.isalpha():
        self.error_label.setText("The part diameter must be a number!")
        self.partDiaText.setText("")

    elif partval == 0:
        self.error_label.setText("The part diameter must be greater than zero!")

    elif partlentext.isalpha():
        self.partLenText.setText("")
        self.error_label.setText("The part length must be a number!")

    elif partlentext == 0:
        self.error_label.setText("The part length must be greater than zero!")

    elif matdia.isalpha():
        self.matDiaText.setText("")
        self.error_label.setText("The material diameter must be a number!")

    elif matdia == 0:
        self.error_label.setText("The material diameter must be greater than zero!")


    else:
        self.error_label.clear()
        self.reset_output()
        self.calc_machining()
        self.calc_times()
        self.calc_qtyVar()
        self.work_centre()
        self.material_code()

(唯一的修改是else块,并在 init 中添加了一行)