使用PyQt5模块中的QProgressDialog类,可以很方便地在GUI界面中添加进度条,来跟踪网络资源下载进度。以下是在使用urllib库下载时如何自动设置进度条的完整使用攻略。
- 添加PyQt5库
在Python代码中使用PyQt5库,需要先通过pip命令安装。在命令行中输入下列命令:
pip install PyQt5
- 导入所需模块
在Python代码中导入所需的PyQt5模块,以及urllib包和其他相关的标准库模块,例如os和threading。
from PyQt5.QtCore import QUrl, QFile, QFileInfo, QIODevice, Qt, QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QProgressDialog
from urllib.request import urlretrieve
import os
import threading
- 创建下载进程的线程
为了避免GUI界面在下载大文件时出现卡住的情况,我们需要在单独的线程中启动下载进程。可以通过创建一个继承于QThread类的自定义线程来实现。
class DownloadThread(QThread):
downloadProgress = pyqtSignal(int)
def __init__(self, url, savepath, parent=None):
super(DownloadThread, self).__init__(parent)
self.url = url
self.savepath = savepath
def run(self):
urlretrieve(self.url, self.savepath, self.reportProgress)
def reportProgress(self, blocknum, blocksize, totalsize):
currentsize = blocknum * blocksize
percent = 100 * currentsize / totalsize
self.downloadProgress.emit(int(percent))
这个线程中包含了一个用于下载的run方法,和一个用于报告下载进度的reportProgress方法。在报告下载进度时,我们需要通过emit信号将进度值发射到主线程中,从而更新QProgressDialog。
- 下载文件并且展示进度条
在主线程中,我们可以使用QProgressDialog类来创建一个进度条,并且在下载进程发射信号时更新进度条的值。
def downloadFile(self, url, savedir):
if not os.path.exists(savedir):
os.makedirs(savedir)
savepath = os.path.join(savedir, os.path.basename(url))
downloadThread = DownloadThread(url, savepath)
progressDialog = QProgressDialog(self)
progressDialog.setLabelText('Downloading...')
progressDialog.setWindowModality(Qt.WindowModal)
progressDialog.setMinimum(0)
progressDialog.setMaximum(100)
progressDialog.setValue(0)
progressDialog.show()
downloadThread.downloadProgress.connect(progressDialog.setValue)
downloadThread.finished.connect(progressDialog.close)
downloadThread.start()
在downloadFile方法中,我们首先创建一个保存文件的完整路径savepath,并且通过创建DownloadThread的实例downloadThread来启动下载进程。然后,我们创建一个QProgressDialog的实例progressDialog,设置窗体模态为Qt.WindowModal,设置进度条的最小值为0,最大值为100,并且显示进度条。
接下来,我们通过downloadProgress信号与progressDialog的setValue方法连接,在下载进程中监听进度值变化信号,并且将其作为参数传递给setValue方法,也就是说,每次下载进度发生变化时,进度条都会相应地更新。最后,我们通过finished信号与progressDialog的close方法连接,表示下载进程结束时,关闭进度条窗口。
- 完整示例代码
下面是一个完整的Python示例代码,展示了如何在使用urllib下载时自动设置进度条:
from PyQt5.QtCore import QUrl, QFile, QFileInfo, QIODevice, Qt, QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QProgressDialog
from urllib.request import urlretrieve
import os
import threading
class DownloadThread(QThread):
downloadProgress = pyqtSignal(int)
def __init__(self, url, savepath, parent=None):
super(DownloadThread, self).__init__(parent)
self.url = url
self.savepath = savepath
def run(self):
urlretrieve(self.url, self.savepath, self.reportProgress)
def reportProgress(self, blocknum, blocksize, totalsize):
currentsize = blocknum * blocksize
percent = 100 * currentsize / totalsize
self.downloadProgress.emit(int(percent))
class Downloader():
def downloadFile(self, url, savedir):
if not os.path.exists(savedir):
os.makedirs(savedir)
savepath = os.path.join(savedir, os.path.basename(url))
downloadThread = DownloadThread(url, savepath)
progressDialog = QProgressDialog(self)
progressDialog.setLabelText('Downloading...')
progressDialog.setWindowModality(Qt.WindowModal)
progressDialog.setMinimum(0)
progressDialog.setMaximum(100)
progressDialog.setValue(0)
progressDialog.show()
downloadThread.downloadProgress.connect(progressDialog.setValue)
downloadThread.finished.connect(progressDialog.close)
downloadThread.start()
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
downloader = Downloader()
downloader.downloadFile('http://www.example.com/largefile.zip', '.')
sys.exit(app.exec_())
在上面的代码中,我们通过最后几行将Downloader的downloadFile方法运行起来,并且展示一个下载进度条,这个进度条会实时更新,在下载完成后自动关闭。如果你需要下载其他的文件,只需要将代码中的url参数和savedir参数修改为相应的值即可。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PyQt5 – 如何在使用urllib下载时自动设置进度条? - Python技术站