PyQt5 – 如何在使用urllib下载时自动设置进度条?
PyQt5 是开发Python GUI桌面应用程序方面的新兴GUI库之一。它具有丰富和强大的功能,确保了应用程序的生产质量。学习PyQt5库是对你知识的一种补充。你可以开发你的消费者质量、高度专业的应用程序。
在这篇文章中,我们将学习如何 在PyQt5中 实现 进度条 的自动化 。 我们所说的自动化是指动态地改变和设置 进度条 的值 。 假设你正在互联网上下载任何文件,并希望显示下载的进度,那么这篇文章一定会帮助你。
在本例中,我们正在使用 Urllib 库来下载文件,因为它是使用python下载文件最常用的库。
语法:
self.progressBar = QProgressBar(self)
QProgressBar类是用来创建进度条对象的。
首先,请看下面的代码,然后我们将解释整个事情的作用。
代码:
# importing libraries
import urllib.request
from PyQt5.QtWidgets import *
import sys
class GeeksforGeeks(QWidget):
def __init__(self):
super().__init__()
# calling a defined method to initialize UI
self.init_UI()
# method for creating UI widgets
def init_UI(self):
# creating progress bar
self.progressBar = QProgressBar(self)
# setting its size
self.progressBar.setGeometry(25, 45, 210, 30)
# creating push button to start download
self.button = QPushButton('Start', self)
# assigning position to button
self.button.move(50, 100)
# assigning activity to push button
self.button.clicked.connect(self.Download)
# setting window geometry
self.setGeometry(310, 310, 280, 170)
# setting window action
self.setWindowTitle("GeeksforGeeks")
# showing all the widgets
self.show()
# when push button is pressed, this method is called
def Handle_Progress(self, blocknum, blocksize, totalsize):
## calculate the progress
readed_data = blocknum * blocksize
if totalsize > 0:
download_percentage = readed_data * 100 / totalsize
self.progressBar.setValue(download_percentage)
QApplication.processEvents()
# method to download any file using urllib
def Download(self):
# specify the url of the file which is to be downloaded
down_url = '' # specify download url here
# specify save location where the file is to be saved
save_loc = 'C:\Desktop\GeeksforGeeks.png'
# Downloading using urllib
urllib.request.urlretrieve(down_url,save_loc, self.Handle_Progress)
# main method to call our app
if __name__ == '__main__':
# create app
App = QApplication(sys.argv)
# create the instance of our window
window = GeeksforGeeks()
# start the app
sys.exit(App.exec())
解释一下。
下面是 urllib 的语法 , 我们必须研究它的所有参数。
语法: urllib.request.urlretrieve(url, filename, reporthook)
参数: 这个方法将采取以下参数 。
第一个参数 是要下载的文件的网址。
第二个参数, 如果存在,指定保存文件的位置(如果这个参数没有通过,位置将是一个自动生成的名称的临时文件)。
第三个参数 是一个可调用文件,当文件被下载时,将被调用,每个区块将被读取,一次又一次。该可调用程序(在本例中是一个函数Handle_Progress)将作为三个参数被传递。
- 到目前为止传输的块的数量(blocknum)。
- 以字节为单位的块大小(blocksize)
- 文件的总大小(totalsize)。
因此,函数 Handle_Progress 接收三个参数。当前下载的文件大小是通过乘以blocknum和blocksize来动态计算的,并存储在变量readed_data中。
其余的工作由计算百分比的公式完成。我们把readed_data乘以100,然后除以文件的总大小。这就给了我们当前的下载百分比。然后我们使用 progressBar 对象的 setValue() 方法将这个下载百分比设置到进度条上。
self.progressBar.setValue(download_percentage)