2017-02-23 4 views
0

FTP에서 네트워크 공유 폴더 (파일 크기가 500MB 이상일 수 있음)로 파일을 다운로드하려고했지만 "시작"을 클릭 할 때마다 GUI가 QThread를 사용하여도 "응답하지 않음"을 표시합니다Pyqt는 QThread를 사용하지만 GUI가 여전히 응답하지 않습니다

내가 잘못 했습니까?

당신은 참으로 잘못하고있다

# -*- 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 

답변

2

main.py.

당신이 지금하고있는 것은 당신이 run 직접 -method 부르지 만, 대신에 당신이 start()를 호출해야하기 때문에 올바른 구현해야한다는 것입니다 :

def Ftpstart(self): 
    self.fp.start() 

서브 클래스 QThread (또는 일반 파이썬 스레드), 스레드를 수행 해야하는 작업을 나타내는 run 메서드를 구현하고 직접 호출하면 스레드 스레드에서 해당 코드를 실행합니다 (이 경우 기본 스레드) . 이것이 GUI가 응답하지 않는 이유입니다.

대신에 start()을 호출하면 실제로 새 스레드를 생성하고 (아직없는 경우) run을 호출합니다. PyQT Documentation에서 :

QThread.start (자기, 우선 순위 우선 순위 = QThread.InheritPriority)

이 실행을 호출하여 스레드의 실행을 시작합니다(). 운영 체제는 우선 순위 매개 변수에 따라 스레드를 예약합니다. 스레드가 이미 실행 중이면이 함수는 아무 작업도 수행하지 않습니다.

그리고 run()

QThread.run (자기)

스레드의 시작 지점에 대한

. start()를 호출 한 후 새롭게 만든 스레드가이 함수를 호출합니다.

+0

매우 나쁜 실수입니다. 감사합니다. – user1484400