我正在开发一个从互联网上下载文件的应用程序。 我为此目的使用过Qt。 下载过程使用包含while循环的QThread对象在单独的线程中运行。 为了显示进度,我在主线程中有一个标签,并更新我发送信号到主线程。 问题是当下载线程启动时标签显示值0并保持为0,下载完成后突然显示100。 两个值之间没有。 我该如何解决这个问题?
我已经使用了repaint()
,processEvents()
和update
方法。他们不工作。
以下是一些供参考的代码:
这是用于创建下载线程的类线程。
class signal(QObject): #For creating signals
sgn=pyqtSignal()
ma=pyqtSignal()
jo=pyqtSignal()
def __init__(self):
super(signal,self).__init__()
class thread(QThread):
def __init__(self):
super(thread,self).__init__()
self.w=signal()
def run(self):
global url
global video
global val
self.w.ma.emit()
size=url.get_filesize()
f=open(video.title+'.'+url.extension,"wb")
resp=urllib.request.urlopen(url.url)
l=0
print(size)
while True:
buf=resp.read(65536)
if not buf:
f.close()
return
l+=len(buf)
val=l//size*100 # val is global variable for progress value
self.w.sgn.emit() # Here I emit the signal
f.write(buf)
线程对象和标签在主GUI线程中定义。
用户按下下载按钮后,我启动线程。
#Main thread
.
.
self.obj=thread()
self.obj.w.sgn.connect(self.m)
def m(self): #Slot for updating
global val
print("Here") #For checking
self.label.setText(str(val))
P.S。 - "在这里"重复打印在控制台中,下载完成后停止。