Python PyQt5';无限循环中的s线程使程序冻结
我有一个非常简单的程序,用Python编写,使用PyQt5的GUI,它监视是否有internet连接。只要存在internet连接(“CONECTADO”)及其对应项(“NO CONECTADO”)(未连接),应用程序就会以castilian西班牙语显示一条消息。每隔一秒钟,单词“CONECTADO”“lits”的前景从深绿色变为浅绿色,“NO CONECTADO”的信息也会变为红色,使其消失,并每隔一秒钟出现一次。我可以设法获得这种效果,但只需要10秒钟左右,因为假定的无限循环不是这样的。此后,无论我是否断开网络连接,消息都保持当前状态。这就好像线程已经冻结或停止运行,我真的不知道 这是我的密码:Python PyQt5';无限循环中的s线程使程序冻结,python,multithreading,pyqt5,qthread,Python,Multithreading,Pyqt5,Qthread,我有一个非常简单的程序,用Python编写,使用PyQt5的GUI,它监视是否有internet连接。只要存在internet连接(“CONECTADO”)及其对应项(“NO CONECTADO”)(未连接),应用程序就会以castilian西班牙语显示一条消息。每隔一秒钟,单词“CONECTADO”“lits”的前景从深绿色变为浅绿色,“NO CONECTADO”的信息也会变为红色,使其消失,并每隔一秒钟出现一次。我可以设法获得这种效果,但只需要10秒钟左右,因为假定的无限循环不是这样的。此后
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_())
我已经阅读并观看了关于这个主题的视频(Python中的Qt线程),但没有一个能向我澄清任何事情。这就是编写这样一个简单程序的意义所在:不仅要完全理解Python中的线程,还要完全理解其他语言中的线程。发布在这里和其他任何地方的PyQt4代码片段对我都不起作用,因为我使用的是PyQt5。请帮忙
非常感谢。概念是一样的:使用信号,这并没有从Qt4变为Qt5。无论如何,我已经为pyqt5添加了另一个副本。