2017-09-05 4 views
1

버튼 클릭으로 함수를 호출 할 때 내 프로그램을 고정시키지 않으려는 문제가 있습니다. 이 함수는 subprocess.Popen을 사용하여 .bat 파일을 엽니 다.하지만 .bat가 실행되는 동안 내 전체 GUI가 정지되며 사용자가 GUI를 계속 사용할 수 있기를 바랍니다. 나는 꽤 스레딩을 처음 접했습니다. 스레딩은이 문제를 해결하는 하나의 방법이라는 것을 이해합니다.하지만 단추를 클릭 할 때마다이 함수를 호출하는 스레드를 어떻게 만드는지는 불확실합니다. 내 기능은 QtDesigner가 만든 창 안에 있다는 것을 명심하십시오. 이 문제를 해결할 수있는 아이디어 나 방법은 무엇입니까? 어쩌면 내가 대답을 찾을 수있는 곳으로 나를 인도 할까?함수 -PyQt GUI 스레딩

메인 클래스 이름 :

클래스 Ui_TestClass (객체) :

내 기능 :

def runprogram(self): 
    dir = self.cwdList[-1] 
    test = os.listdir(dir) 
    for item in test: 
     if item.endswith('.OUT'): 
      os.remove(join(dir, item)) 
    new, ok = QInputDialog.getText(None, "Case Name","Type in a case name to run. (No Spaces) \nOn file dialog, choose file to rename.") 
    if (ok): 
     newcase = new 
    changename = str(QtWidgets.QFileDialog.getOpenFileName(None, 'Choose file', '{0}'.format(self.cwdList[-1]), 'Text files (*.ZCSP*)')[0]) 
    shutil.move(changename, '{0}\{1}.ZCSP'.format(self.cwdList[-1], newcase)) 
    self.replaceText('{0}.ZCSP'.format(newcase)) 
    with open('Test.bat', "w") as runname: 
     run = 'ZCSP {0}.ZCSP {0}.OUT'.format(newcase, newcase) 
     runname.write(run) 
    process = subprocess.Popen([r"{0}\Test.bat".format(self.cwdList[-1])]) 
    process.wait() 

self.cwdList이 디렉토리의 단지 목록입니다

t = threading.Thread(target=self.runprogram) 
t.start() 

이 방법이 효과가있을 수도 있지만 QtDesigner에서 만든 코드에 어떻게 삽입합니까?

답변

0

단순히 process.wait()를 제거하여 문제를 해결했습니다. QtDesigner에서 코드를 작성한 스레드를 사용하는 방법에 대한 해결책을 찾는 데 여전히 관심이 있습니다.