Проблема в том, что вы не можете вызвать графический интерфейс напрямую в другом потоке, поэтому есть два возможных решения: использовать сигнал для вызова метода, который показывает QMessageBox, или использовать QMetaObject.invokeMethod для вызова этого метода, в этом случае я будет использовать второй, так как в первом есть много примеров в SO.
from PyQt5 import QtCore, QtWidgets, uic
from PyQt5 import uic
import threading
class TheThread(threading.Thread):
def __init__(self, text, obj):
threading.Thread.__init__(self)
self.tx = text
self.obj = obj
def run(self):
try:
print(int(self.tx),"number")
except:
QtCore.QMetaObject.invokeMethod(self.obj, "onError",
QtCore.Qt.QueuedConnection,
QtCore.Q_ARG(str, "Error"),
QtCore.Q_ARG(str, "Error"))
class Principal(QtWidgets.QMainWindow):
def __init__(self):
super(Principal, self).__init__()
uic.loadUi("test.ui",self)
self.lineEdit.textChanged.connect(self.evalNumeros)
@QtCore.pyqtSlot(str)
def evalNumeros(self,texto):
threadClass = TheThread(texto, self)
threadClass.start()
@QtCore.pyqtSlot(str, str)
def onError(self, title, text):
QtWidgets.QMessageBox.critical(None, title, text, QtWidgets.QMessageBox.Ok)
app = QtWidgets.QApplication([])
p = Principal()
p.show()
app.exec_()