Нет обновления GUI в PyQt5, когда я использую потоки - PullRequest
0 голосов
/ 08 марта 2019

Я прочитал информацию о температуре и напряжении с контроллера с Modbus Lib.Когда я делаю это "попробуй ... кроме", все работает нормально.Но когда я делаю это в цикле while с Thread, графический интерфейс остается постоянным в течение примерно 20 секунд.Тем не менее, температура печати работает правильно.Затем, когда я нажимаю кнопку на графическом интерфейсе, информация о графическом интерфейсе обновляется.

from PyQt5 import QtCore, QtGui, QtWidgets, uic
from PyQt5.QtWidgets import QApplication
import time
from modbusFunction import *

Первый код с пробой, кроме второго кода с циклом и поточностью:

class test(QtWidgets.QMainWindow):
    def __init__(self):
        super(test, self).__init__()
        uic.loadUi('ui/test.ui', self)
        self.readTemp()

    def readTemp(self):
        try:
            temp = modbusFunction.modbusReadRegister(self, '192.168.1.13', 502, 0x1192, 1)
            print(temp[0])
            self.supplyTempResualt.setText(str(temp[0]))
        except Exception as err:
            print(err)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = test()
    window.show()
    sys.exit(app.exec_())

второй код:

from threading import Thread

class test(QtWidgets.QMainWindow):
    def __init__(self):
        super(test, self).__init__()
        uic.loadUi('ui/test.ui', self)

        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.supplyTempResualt.setText(str(temp[0]))
            except Exception as err:
                print(err)
            time.sleep(1)


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = test()
    window.show()
    sys.exit(app.exec_())

1 Ответ

1 голос
/ 08 марта 2019

Не следует обновлять графический интерфейс напрямую из другого потока, для обновления используются следующие методы:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...