QCoreApplication无法正常终止

时间:2018-10-03 12:18:26

标签: python python-3.x pyqt pyqt5

我是PyQt5新手。我编写了一个简单的CLI脚本,该脚本发出GET请求,打印结果,然后退出并出现错误: “ QWaitCondition:在线程仍在等待时被销毁”

我在做什么错?我的代码如下所示:

from PyQt5.QtCore import QCoreApplication, QObject, QUrl
from PyQt5.QtNetwork import QNetworkRequest, QNetworkAccessManager, QNetworkReply
import sys

class MainWindow(QObject):
    def __init__(self):
        super().__init__()

        target = "http://pyqt.sourceforge.net/Docs/PyQt5/index.html"
        request = QNetworkRequest(QUrl(target))

        self.networkAccessManager = QNetworkAccessManager()
        #self.networkAccessManager.finished[QNetworkReply].connect(self.headsUp)
        self.networkAccessManager.finished.connect(self.onFinished)
        self.networkAccessManager.get(request)

    def onFinished(self, response): #response is an object of type QNetworkReply
        error = response.error()

        if (error == QNetworkReply.NoError):
            result = response.readAll()
            print(response.header(QNetworkRequest.ContentTypeHeader))
            print(response.header(QNetworkRequest.LastModifiedHeader))
            print(response.header(QNetworkRequest.ContentLengthHeader))
        else:
            print("There was an error. "+response.errorString())

        self.windUp(response)        

    def windUp(self, replyObject): #replyObject is an object of type QNetworkReply
        print("Done")
        replyObject.deleteLater()
        QCoreApplication.quit()       


if __name__ == '__main__':

    qApp = QCoreApplication(sys.argv)
    w = MainWindow()
    sys.exit(qApp.exec_())

1 个答案:

答案 0 :(得分:1)

运行代码时,我没有收到任何错误,只有一个空答案。

text/html
None
0
Done

这是正确的,因为在该URL中没有内容,因为如果您使用浏览器,我们将看到它将我们重定向到另一个URL:https://sourceforge.net/projects/pyqt/,因此启用该重定向RedirectionTargetAttribute分析了回复的属性。

import sys
from PyQt5 import QtCore, QtNetwork


class MainWindow(QtCore.QObject):
    def __init__(self):
        super().__init__()
        target = "http://pyqt.sourceforge.net"
        self.manager = QtNetwork.QNetworkAccessManager(self)
        self.manager.finished.connect(self.on_finished)
        self.start_request(target)

    def start_request(self, url):
        request = QtNetwork.QNetworkRequest(QtCore.QUrl(url))
        self.manager.get(request)

    @QtCore.pyqtSlot(QtNetwork.QNetworkReply)
    def on_finished(self, reply):
        redirection_target = reply.attribute(QtNetwork.QNetworkRequest.RedirectionTargetAttribute)
        if reply.error():
            print("There was an error. {}".format(response.errorString()))
        elif redirection_target is not None:
            reply.deleteLater()
            print("redirection_target: {}".format(redirection_target))
            self.start_request(redirection_target)
        else:
            print(reply.header(QtNetwork.QNetworkRequest.ContentTypeHeader))
            print(reply.header(QtNetwork.QNetworkRequest.LastModifiedHeader))
            print(reply.header(QtNetwork.QNetworkRequest.ContentLengthHeader))
            print(reply.readAll())
            reply.deleteLater()
            QtCore.QCoreApplication.quit()


if __name__ == '__main__':
    app = QtCore.QCoreApplication(sys.argv)
    w = MainWindow()
    sys.exit(app.exec_())

输出:

redirection_target: PyQt5.QtCore.QUrl('https://sourceforge.net/projects/pyqt/')
text/html; charset=utf-8
None
None
b'<!doctype html>\n<!-- Server: sfs-consume-8 -->\n<html class="no-js" lang="en">\n    <head>\n        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><script type="text/...