我如何使用 PyQt5 运行 while 循环 [英] How I can run while loop with PyQt5

查看:450
本文介绍了我如何使用 PyQt5 运行 while 循环的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在一个项目上工作:程序下载,但我在检查与互联网的连接时使用 while 循环有问题,如果 true 没有将 setText('') 设置为标签,如果 Flase setText('anyText') 为标签

I work on one Project : Program download but I have a problem with while loop for check the connection with the internet and if true doesn't setText('') to lable and if Flase setText('anyText') to lable

连接检查方法

    def checkInternetConnection(self,host="8.8.8.8", port=53, timeout=3):

    while self.conection==False:
        try:
            socket.setdefaulttimeout(timeout)
            socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((host, port))
            self.conection = True
            return self.conection

        except Exception as e:
                print(e)
                self.label_9.setText('Please Check Internect Connection')
                self.conection = False
                return self.conection
    self.finished.emit()

我厌倦了 QThread .请问我该怎么做:)?当应用程序运行时,如果连接丢失=False setText('check internet') 并且当连接变为 true setText('')

I have tired with QThread . Please How I can do it :) ? And when app is running if connection is lost=False setText('check internet') and when the connection become true setText('')

构造函数

From_Class,_=loadUiType(os.path.join(os.path.dirname(__file__),'designe.ui'))
class mainApp(QMainWindow,From_Class):
    finished = pyqtSignal()
    def __init__(self,parent=None):
        super(mainApp, self).__init__(parent)
        QMainWindow.__init__(self)
        super().setupUi(self)
        self.handleGui()
        self.handleButton()
        self.setWindowIcon(QIcon('mainIcon.png'))
        self.menuBarW()
        self.conection = False

主代码

def main():
    app = QApplication(sys.argv)
    window = mainApp()
    window.checkInternetConnection()
    window.show()
    app.exec()

if __name__=='__main__':
    main()

推荐答案

QThread 不要太复杂,使用线程库:

Do not get complicated with QThread, use the threading library:

def main():
    app = QtWidgets.QApplication(sys.argv)
    window = mainApp()
    threading.Thread(target=window.checkInternetConnection, daemon=True).start()
    window.show()
    app.exec()

另一方面,由于您正在使用一个线程,您不应该从另一个线程更新 GUI,为此您可以使用 QMetaObject::invokeMethod:

On the other hand, since you are using a thread, you should not update the GUI from another thread, for this you can use QMetaObject::invokeMethod:

def checkInternetConnection(self,host="8.8.8.8", port=53, timeout=3):
    while True:
        try:
            socket.setdefaulttimeout(timeout)
            socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((host, port))
            self.conection = True
        except Exception as e:
            self.conection = False
            print(e)
        msg = "" if self.conection else 'Please Check Internect Connection'
        print("msg", msg)
        QtCore.QMetaObject.invokeMethod(self.label_9, "setText",
            QtCore.Qt.QueuedConnection,  
            QtCore.Q_ARG(str, msg))
    self.finished.emit()

这篇关于我如何使用 PyQt5 运行 while 循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆