Не следует обновлять графический интерфейс напрямую из другого потока, для обновления используются следующие методы:
1. pyqtSignal ()
class test(QtWidgets.QMainWindow):
textChanged = QtCore.pyqtSignal()
def __init__(self):
super(test, self).__init__()
uic.loadUi('ui/test.ui', self)
self.textChanged.connect(self.supplyTempResualt.setText)
t = Thread(target = self.readTemp)
t.daemon = True
t.start()
def readTemp(self):
while True:
try:
temp = modbusFunction.modbusReadRegister(self, '192.168.1.13', 502, 0x1192, 1)
print(temp[0])
self.textChanged.emit(str(temp[0]))
except Exception as err:
print(err)
time.sleep(1)
2. QMetaObject :: InvokeMethod
def readTemp(self):
while True:
try:
temp = modbusFunction.modbusReadRegister(self, '192.168.1.13', 502, 0x1192, 1)
print(temp[0])
QtCore.QMetaObject.invokeMethod(self.supplyTempResualt, "setText",
QtCore.Qt.QueuedConnection, QtCore.Q_ARG(str, str(temp[0])))
except Exception as err:
print(err)
time.sleep(1)
3. functools.partial с QTimer.singleShot ()
from functools import partial
# ...
def readTemp(self):
while True:
try:
temp = modbusFunction.modbusReadRegister(self, '192.168.1.13', 502, 0x1192, 1)
print(temp[0])
QtCore.QTimer.singleShot(0, partial(self.supplyTempResualt.setText, str(temp[0])))
except Exception as err:
print(err)
time.sleep(1)