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.