Поток Python PyQt5 в бесконечном цикле заставляет программу зависать

У меня есть очень простая программа, написанная на Python и использующая графический интерфейс PyQt5, который отслеживает, есть ли подключение к Интернету или нет. Приложение отображает сообщение на кастильском испанском языке всякий раз, когда есть подключение к Интернету (CONECTADO) и его аналог (NO CONECTADO) (Not connected). Каждую секунду слово CONECTADO загорается, меняя свой передний план с темно-зеленого на светло-зеленый, так же как и сообщение NO CONECTADO, но становится красным, и оно также исчезает и появляется снова каждую секунду. Мне удается добиться такого эффекта, но только на десять секунд или около того, поскольку предполагаемый бесконечный цикл не таков. По истечении этого времени сообщение остается с текущим состоянием независимо от того, отключаюсь я от сети или нет. Я точно не знаю, как если бы поток завис или остановился.

Вот мой код:

from PyQt5 import QtCore, QtGui, QtWidgets
import urllib.request
import time
import threading
from threading import Lock

class Ui_MainWindow(object):

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.lbl_estado_conex = QtWidgets.QLabel(self.centralwidget)
        self.lbl_estado_conex.setGeometry(QtCore.QRect(170, 190, 481, 91))
        self.lbl_estado_conex.setStyleSheet("background:black;color:white;font-size:50px;border-radius:20px;")
        self.lbl_estado_conex.setAlignment(QtCore.Qt.AlignCenter)
        self.lbl_estado_conex.setObjectName("lbl_estado_conex")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

        self.estilo_conectado="background:black;color:green;font-size:50px;border-radius:20px;"
        self.estilo_luminoso="background:black;color:lightgreen;font-size:50px;border-radius:20px;"
        self.estilo_no_conectado="background:black;color:red;font-size:50px;border-radius:20px;"


    def actualizar_label(self):

        self.threadclass=ThreadClass()
        self.threadclass.start()
    

    def retranslateUi(self, MainWindow):
    _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Monitor De Conexión LAN"))
        self.lbl_estado_conex.setText(_translate("MainWindow", "Estado"))




class ThreadClass(QtCore.QThread):



    def __init__(self,parent=None):

        super(ThreadClass,self).__init__(parent)


    def run(self):

        self.host='http://192.168.1.1'

        while True:
            
            try:

                urllib.request.urlopen(self.host) #Python 3.x
                self.mensaje="CONECTADO"
                ui.lbl_estado_conex.setText(self.mensaje)
                ui.lbl_estado_conex.setStyleSheet(ui.estilo_conectado)
                time.sleep(1)
                ui.lbl_estado_conex.setStyleSheet(ui.estilo_luminoso)
                time.sleep(1)
           
            except:

                self.mensaje="NO CONECTADO"
                ui.lbl_estado_conex.setText(self.mensaje)
                ui.lbl_estado_conex.setStyleSheet(ui.estilo_no_conectado)
                time.sleep(1)
                ui.lbl_estado_conex.setText("")
            


if __name__ == "__main__":

    import sys

    bloqueo=Lock()
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()

ui.actualizar_label()

sys.exit(app.exec_())

Я читал и смотрел видео по этой теме (потоки Qt в Python), но ни один из них ничего не проясняет для меня. И в этом суть написания такой простой программы: полностью понимать потоки не только в Python, но и на других языках тоже. Фрагменты кода PyQt4, размещенные здесь и где-либо еще, у меня не работают, так как я использую PyQt5. Пожалуйста помоги.

Большое тебе спасибо.


person Alberto    schedule 23.10.2020    source источник
comment
Концепция та же: используйте сигналы, и это не изменилось с Qt4 на Qt5. В любом случае я добавил еще один дубликат для pyqt5.   -  person eyllanesc    schedule 23.10.2020