我的程序下载图片,现在我试图使进度条正常工作,但是我找不到一种计算方法,然后将其显示在进度条上的方法。我已经尝试了一些方法,但是我的脚本在尝试计算时只是冻结了。我将PYQT5用于UI上的进度栏。我的目标是计算用户输入以及文件夹中有多少输入,因此,假设它从10个下载了5张图片,然后在进度栏中显示50%。
我尝试过的内容:
def ProgressBar(self):
self.complete = 0
while self.complete < 100:
self.final_value = self.li_MaxImages // 100
self.pb_ProgressBar.setValue(complete)
从读取的内容(读取的最大图像输入数量)
def execute_downloader(self):
s_URL = self.li_Url.text()
s_Folder = self.li_FolderName.text()
s_Max = self.li_MaxImages.text()
[当程序进入while
循环时,它将阻止事件循环并避免更新UI。
这就是为什么您永远不要在UI部分中使用循环。
最简单的更新进度条的方法是使用信号/插槽来更新它:每次下载文件时发送一个信号,并将其连接到将更新进度条的插槽中。
一个简单的例子:
class UI(QWidget):
def __init__(self):
super().__init__()
self.progressBar = QProgressBar(self)
self.progressBar.setMinimum(0)
self.progressBar.setValue(0)
layout = QHBoxLayout(self)
layout.addWidget(self.progressBar)
def prepare(self, count): # Set the maximum to the number of files to download
print("Count: ", count)
self.progressBar.setMaximum(count)
def progress(self): # Called each time a file has been downloaded
print(self.progressBar.value())
self.progressBar.setValue(self.progressBar.value() + 1)
class DownLoader(QObject):
startDownload = pyqtSignal(int)
downloaded = pyqtSignal()
def __init__(self):
super().__init__()
self.timer = QTimer(self) # Simulates the download (3 seconds)
self.timer.setInterval(3000)
self.timer.timeout.connect(self.downloaded)
def start(self):
self.startDownload.emit(5) # We have 5 files to download
self.timer.start()
if __name__ == "__main__":
#import sys
app = QtWidgets.QApplication(sys.argv)
ui = UI()
ui.show()
downloader = DownLoader()
downloader.startDownload.connect(ui.prepare)
downloader.downloaded.connect(ui.progress)
downloader.start()
app.exec_()
在此示例中,Downloader
只是一个存根,它使用计时器模拟下载。替换为实际的下载器。