繁体   English   中英

Pyqt使用QThread,但GUI仍然没有响应

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM