[英]Pyqt use QThread but GUI still not responding
我试图将文件从FTP下载到网络共享文件夹(文件大小可能为500mb或更大),但是每次单击“开始”时,即使使用QThread,GUI也会显示“无响应”
我做错了什么吗?
main.py
# -*- coding: utf-8 -*-
from PyQt4 import QtGui
import ftp100
class main_windows(QtGui.QWidget):
def __init__(self):
super(main_windows, self).__init__()
self._count = 0
self.Ftpallobject = []
def init(self):
#PASS SOME GUI CODE
button_go = QtGui.QPushButton('GO')
button_go.clicked.connect(self.Ftpstart)
self.fp = ftp100.ftpmethod()
self.fp.requestSignal_getinfo.connect(self.Ftpallobject)
def SendFtpInfo(self):
self.fp.update_getinfo.emit(self.allobject)
def Ftpstart(self):
self.fp.run()
ftp.py
# -*- coding: utf-8 -*-
from PyQt4 import QtCore
import ftputil
class ftpmethod(QtCore.QThread):
requestSignal_getinfo = QtCore.pyqtSignal()
update_getinfo = QtCore.pyqtSignal(list)
def __init__(self, parent=None):
super(ftpmethod, self).__init__(parent)
self._count = 0
self.ftpinfo = []
self.update_getinfo.connect(self.getinfo)
def run(self):
self.requestSignal_getinfo.emit()
while self._count<1:
for i in self.ftpinfo:
site = "".join(str(i[2].text()))
account = "".join(str(i[0].text()))
pwd = "".join(str(i[1].text()))
filepath = "".join(str(i[3].text()))
filename = "".join(str(i[4].text()))
downloadtolocal = "".join(str(i[7].text()))+"".join(str(i[4].text()))
print site,account,pwd,filepath,filename,downloadtolocal
try:
with ftputil.FTPHost(site,account,pwd) as host:
if filepath=='':
host.download(filename,downloadtolocal)
else:
host.chdir(filepath)
host.download(filename,downloadtolocal)
except:
print 'FTP ERROR'
self._count+=1
self._count=0
def getinfo(self,info):
self.ftpinfo = info
您确实做错了。
现在要做的是直接调用run
-method,而不是应该调用start()
,所以正确的实现应该是:
def Ftpstart(self):
self.fp.start()
当子类化QThread
(或与此相关的常规python线程)时,您将实现run
-method,该方法表示该线程应执行的工作,并且如果直接调用它,则可以在当前线程中执行该代码(因此在插入主线程)。 这就是您的GUI无法响应的原因。
但是,如果改为调用start()
,它将实际上首先生成一个新线程(如果尚不存在),然后调用run
。 从PyQT文档中 :
QThread.start(自己,优先级优先级= QThread.InheritPriority)
通过调用run()开始执行线程。 操作系统将根据优先级参数调度线程。 如果线程已经在运行,则此功能不执行任何操作。
对于run()
QThread.run(个体)
线程的起点。 调用start()之后,新创建的线程将调用此函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.