使用 QtNetwork 和 PyQt5 检查互联网连接



我正在尝试使用QtNetwork艰难地检查网络连接,但无法弄清楚如何正确执行此操作。这是我正在处理的代码,似乎既没有调用finished信号,也没有调用error信号。我在这里错过了什么?

import sys
from PyQt5 import QtCore, QtNetwork, QtWidgets

class CheckConnectivity:
    def __init__(self):
        url = QtCore.QUrl("https://www.google.com/")
        req = QtNetwork.QNetworkRequest(url)
        net_manager = QtNetwork.QNetworkAccessManager()
        self.res = net_manager.get(req)
        self.res.finished.connect(self.processRes)
        self.res.error.connect(self.processErr)
        self.msg = QtWidgets.QMessageBox()
    def processRes(self):
        if self.res.bytesAvailable():
            self.msg.information(self, "Info", "You are connected to the Internet.")
        else:
            self.msg.critical(self, "Info", "You are not connected to the Internet.")
        self.msg.show()
        self.res.close()
    def processErr(self, *args):
        print(*args)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    ic = CheckConnectivity()
    sys.exit(app.exec_())
问题

是由于删除net_manager引起的,请记住,变量仅存在于创建它的上下文中,在您的情况下net_manager是一个局部变量,将在__init__方法结束时删除。

class CheckConnectivity(QtCore.QObject):
    def __init__(self, *args, **kwargs):
        QtCore.QObject.__init__(self, *args, **kwargs)
        url = QtCore.QUrl("https://www.google.com/")
        req = QtNetwork.QNetworkRequest(url)
        self.net_manager = QtNetwork.QNetworkAccessManager()
        self.res = self.net_manager.get(req)
        self.res.finished.connect(self.processRes)
        self.res.error.connect(self.processErr)
        self.msg = QtWidgets.QMessageBox()
    @QtCore.pyqtSlot()
    def processRes(self):
        if self.res.bytesAvailable():
            self.msg.information(None, "Info", "You are connected to the Internet.")
        self.res.deleteLater()
    @QtCore.pyqtSlot(QtNetwork.QNetworkReply.NetworkError)
    def processErr(self, code):
        self.msg.critical(None, "Info", "You are not connected to the Internet.")
        print(code)

建议使用 pyqtSlot() 装饰器,因为它的使用有助于应用程序更快一点并消耗更少的内存,但为此,该类必须继承自 QObject .

最新更新