LineEdit doesn't show exception from another class, crashes when returning value

27 views Asked by At

I have two modules; one is a frequency parser that should return a value in Hz otherwise through some exceptions depending on different mistakes in the user input.

Here is the code (ModuleParse.py):

import re

FrequencyTypes = {
    "T": 1E12,
    "THz": 1E12,
    'G': 1E9,
    'GHz': 1E9,
    "M": 1E6,
    "MHz": 1E6,
    "K": 1E3,
    "KHz": 1E3
}


class FreqParse:
    def __init__(self, Input, mode):
        self.Input = Input
        self.mode = mode
        self.UserInput = self.Input.replace(" ", "")
        self.Str = re.findall('[a-zA-Z]+', self.UserInput)
        self.Num = re.findall('[0-9]+', self.UserInput)
        if self.mode == "Frequency":
            self.handling = self.FrequencyHandling

    def FrequencyHandling(self):
        FreqNum = self.Num
        FreqStr = self.Str

        try:
            if len(FreqNum) != 1:
                raise TypeError('Frequency input should be in the format of "number" or "number+unit"; '
                                'for example: 64000000000, 64E9, 64GHz, or 64G')
            else:
                if len(FreqStr) >= 2:
                    raise TypeError('Frequency input should be in the format of "number" or "number+unit"; '
                                    'for example: 64000000000, 64E9, 64GHz, or 64G')
                elif len(FreqStr) == 0:
                    VALUE = float(FreqNum[0])
                    print(VALUE, " Hz")
                    #return VALUE
                else:
                    try:
                        if FreqStr[0] in FrequencyTypes:
                            VALUE = float(FreqNum[0])*FrequencyTypes.get(FreqStr[0])
                            print(VALUE, " Hz")
                            #return VALUE
                        else:
                            raise KeyError("Unit wasn't found in the FrequencyTypes dictionary; available units are: "
                                           "T (THz), G (GHz), M (MHz), K (KHz)")
                    except KeyError as error1:
                        print("Error> ", error1)
                # return VALUE
        except TypeError as error:
            print("Error> Wrong input: ", error)

Second module is a gui code (ModuleGUI.py). In the "Frequency" field, when user inserts a value, it checks the input using "ModuleParse.py"; if it is correct, it should return a value, otherwise shows the exception/error in the "plainTextEdit_1" window.

here is the code for "ModuleGUI.py":

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
import ModuleParse


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(738, 234)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton_1 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_1.setGeometry(QtCore.QRect(470, 150, 91, 23))
        self.pushButton_1.setObjectName("pushButton_1")
        self.lineEdit_1 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_1.setGeometry(QtCore.QRect(570, 80, 121, 20))
        self.lineEdit_1.setObjectName("lineEdit_1")
        self.lineEdit_1.editingFinished.connect(self.UserInputSampleRate)
        self.label_1 = QtWidgets.QLabel(self.centralwidget)
        self.label_1.setGeometry(QtCore.QRect(470, 80, 80, 13))
        self.label_1.setObjectName("label_1")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(570, 110, 121, 20))
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(470, 110, 80, 13))
        self.label_2.setObjectName("label_2")
        self.plainTextEdit_1 = QtWidgets.QPlainTextEdit(self.centralwidget)
        self.plainTextEdit_1.setEnabled(False)
        self.plainTextEdit_1.setGeometry(QtCore.QRect(10, 80, 441, 81))
        self.plainTextEdit_1.setObjectName("plainTextEdit_1")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 738, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton_1.setText(_translate("MainWindow", "Button"))
        self.lineEdit_1.setText(_translate("MainWindow", "64e9"))
        self.label_1.setText(_translate("MainWindow", "Frequency (Hz)"))
        self.label_2.setText(_translate("MainWindow", "Next field"))


    def UserInputSampleRate(self):
        if not self.lineEdit_1.text():
            color_format = self.plainTextEdit_1.currentCharFormat()
            color_format.setForeground(QtGui.QColor(255, 0, 0))
            self.plainTextEdit_1.setCurrentCharFormat(color_format)
            self.plainTextEdit_1.insertPlainText("Sample Rate > Enter a value \n")
        else:
            FrequencyParseOutput = ModuleParse.FreqParse(self.lineEdit_1.text(), "Frequency")
            self.plainTextEdit_1.setPlainText("{} \n".format(FrequencyParseOutput.FrequencyHandling()))


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Unfortunately, it is not working as I expected; first, "plainTextEdit_1" doesn't show the Exception message defined in "ModuleParse.py". Second, if I uncomment "return VALUE" in the "ModuleParse.py", "ModuleGUI.py" will crash when user inserts the correct value.

Note: I decided to use "editingFinished" for "lineEdit_1" as a signal method because if I use other methods, when I am making any changes in the "lineEdit_1", it will call "ModuleParse.py" instantly and it is not desirable.

0

There are 0 answers