我试图用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_())发布于 2018-01-19 14:43:29
问题是因为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继承。
https://stackoverflow.com/questions/48343322
复制相似问题