亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何通過 QNetworkAccessManager 等待兩個異步下載完成?

如何通過 QNetworkAccessManager 等待兩個異步下載完成?

揚帆大魚 2023-10-26 16:37:56
===總結=============================================我使用 QNetworkAccessManager 和 QNetworkRequests 同時下載兩個圖像。我如何確定兩次下載已完成?===詳細說明=================================我有兩個圖像的 URL,我想異步下載它們。為此,我初始化 QNetworkAccessManager 并使用兩個 QNetworkRequest。完成后,每個請求都會將圖像的內容寫入文件中。問題是兩個請求彼此一無所知,因此無法驗證另一個請求是否已完成。您能告訴我如何等待這兩個請求完成嗎?這是完整的代碼:import sysfrom PyQt5.QtCore import QUrl, QFile, QIODevicefrom PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequestfrom PyQt5.QtWidgets import QApplication, QWidgetclass MainWindow(QWidget):    def __init__(self):        super(MainWindow, self).__init__()        img_url1 = "https://somesite.com/image1.jpg"        img_url2 = "https://somesite.com/image2.jpg"        self.downloader = QNetworkAccessManager()        self.requests = []        self.temp_files = []        for index, mediafile_url in enumerate([img_url1, img_url2]):            self.requests.append(self.downloader.get(QNetworkRequest(QUrl(mediafile_url))))            request = self.requests[index]            self.temp_files.append(QFile(f'{mediafile_url.split("/")[-1]}'))            temp_file = self.temp_files[index]            request.finished.connect(lambda *args, r=request, tf=temp_file: self.download_image(r, tf))        self.show()    @staticmethod    def download_image(request, temp_file):        image_data = request.readAll()        temp_file.open(QIODevice.WriteOnly)        temp_file.write(image_data)        temp_file.close()app = QApplication(sys.argv)window = MainWindow()app.exec_()
查看完整描述

1 回答

?
MMMHUHU

TA貢獻1834條經驗 獲得超8個贊

您必須創建一個跟蹤下載的類:


from dataclasses import dataclass

import sys


from PyQt5.QtCore import pyqtSignal, QObject, QUrl, QFile, QIODevice

from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply

from PyQt5.QtWidgets import QApplication, QWidget



@dataclass

class DownloadRequest:

    url: QUrl

    filename: str



class DownloadManager(QObject):

    finished = pyqtSignal()


    def __init__(self, parent=None):

        super().__init__(parent)

        self._manager = QNetworkAccessManager()

        self._pending_downloads = 0


        self.manager.finished.connect(self.handle_finished)


    @property

    def manager(self):

        return self._manager


    @property

    def pending_downloads(self):

        return self._pending_downloads


    def download(self, requests):

        for request in requests:

            qrequest = QNetworkRequest(request.url)

            qrequest.setAttribute(QNetworkRequest.User, request.filename)

            self.manager.get(qrequest)

            self._pending_downloads += 1


    def handle_finished(self, reply):

        self._pending_downloads -= 1

        if reply.error() != QNetworkReply.NoError:

            print(f"code: {reply.error()} message: {reply.errorString()}")

        else:

            print("successful")

            filename = reply.attribute(QNetworkRequest.User)

            file = QFile(filename)

            if file.open(QIODevice.WriteOnly):

                file.write(reply.readAll())


        print(f"pending downloads {self.pending_downloads}")

        if self.pending_downloads == 0:

            self.finished.emit()



class MainWindow(QWidget):

    def __init__(self, parent=None):

        super().__init__(parent)


        self._manager = DownloadManager()

        self._manager.finished.connect(self.handle_finished)


        img_url1 = "https://docs.python.org/3/_static/py.png"

        img_url2 = "https://somesite.com/image2.jpg"


        request1 = DownloadRequest(QUrl(img_url1), img_url1.split("/")[-1])

        request2 = DownloadRequest(QUrl(img_url2), img_url2.split("/")[-1])


        self._manager.download([request1, request2])


    def handle_finished(self):

        print("finished")



def main():

    app = QApplication(sys.argv)

    window = MainWindow()

    window.show()

    app.exec_()



if __name__ == "__main__":

    main()


查看完整回答
反對 回復 2023-10-26
  • 1 回答
  • 0 關注
  • 179 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號