【问题标题】:Checking internet connectivity using QtNetwork and PyQt5使用 QtNetwork 和 PyQt5 检查互联网连接
【发布时间】:2018-06-28 19:49:10
【问题描述】:

我正在尝试使用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_())

【问题讨论】:

    标签: python pyqt pyqt5 qtnetwork


    【解决方案1】:

    问题是因为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

    【讨论】:

    • @ellaynesc 感谢您对我的代码提出的宝贵建议和无价的贡献。该代码工作正常,但如何减少超时量。现在弹出关键消息需要 4-5 秒
    • @eyllansec 谢谢,我会选择QTimer。你知道 pyqt5 上有什么最新的资源吗?
    • @eyllansec 任何书籍或视频或任何您推荐在 pyqt5 上阅读或观看的内容?
    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    相关资源
    最近更新 更多