我写了一些代码从web下载文件。下载时,它显示了在PyQt中使用QProgressBar的百分比。但当我下载时,它停止了,最终只显示100%。我应该怎么做才能连续显示百分比?
这是python代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, urllib2
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4 import uic
form_class = uic.loadUiType("downloadergui.ui")[0]
class MainWindow(QMainWindow, form_class):
def __init__(self):
super(MainWindow, self).__init__()
self.setupUi(self)
self.connect(self.downloadButton, SIGNAL("clicked()"), self.downloader)
def downloader(self):
print "download"
url = "[[Fill in the blank]]"
file_name = url.split('/')[-1]
u = urllib2.urlopen(url)
f = open(file_name, 'wb')
meta = u.info()
file_size = int(meta.getheaders("Content-Length")[0])
self.statusbar.showMessage("Downloading: %s Bytes: %s" % (file_name, file_size))
file_size_dl = 0
block_sz = 8192
while True:
buffer = u.read(block_sz)
if not buffer:
break
file_size_dl += len(buffer)
f.write(buffer)
downloadPercent = int(file_size_dl * 100 / file_size)
self.downloadProgress.setValue(downloadPercent)
f.close()
pass
app = QApplication(sys.argv)
myWindow = MainWindow()
myWindow.show()
app.exec_()
GUI始终作为事件驱动的模型工作,这意味着它的工作取决于从内部和外部接收事件。
例如,当u将Value设置为时,它会发出一个valuechange信号。在您的情况下,下载逻辑u设置进度条的值。但是程序处理程序没有机会更新UI,因为下载逻辑占据了主线程。
这就是为什么我们说u不能在主UI线程中执行长时间消耗逻辑的原因。
在您的情况下,我建议您使用一个新线程通过向主线程发送信号来下载和更新进度值。