2013-02-26 1 views
3

PyQt4 애플리케이션에는 사용자가 avi 파일을 저장할 수있는 기능이 있습니다. 이를 위해 이하는 saveMovie 방법은 메인 창에 구현되었습니다PyQt : 선택 후 QtGui.QFileDialog.getSaveFileName이 닫히지 않습니다.

def saveMovie(self): 
    """ Let the user make a movie out of the current experiment. """ 
    filename = QtGui.QFileDialog.getSaveFileName(self, "Export Movie", "", 
               'AVI Movie File (*.avi)') 

    if filename != "": 
     dialog = QtGui.QProgressDialog('', 
             QtCore.QString(), 
             0, 100, 
             self, 
             QtCore.Qt.Dialog | 
             QtCore.Qt.WindowTitleHint) 

     dialog.setWindowModality(QtCore.Qt.WindowModal) 
     dialog.setWindowTitle('Exporting Movie') 
     dialog.setLabelText('Resampling...') 

     dialog.show() 

     make_movie(self.appStatus, filename, dialog) 

     dialog.close() 

내 생각은 비디오 인코딩 작업을 진행하는 방법을 보여주기 위해 QProgressDialog을 사용하는 것입니다.
그럼에도 불구하고 파일 이름 선택 후 QFileDialog이 사라지지 않으며 make_movie 함수가 완료 될 때까지 전체 응용 프로그램이 응답하지 않습니다.

이 문제를 방지하려면 어떻게해야합니까?

+0

'processEvents()'에 대한 호출을 추가해보십시오. [이 질문] (http://stackoverflow.com/questions/9622021/pyqt-run-time-issue)을 참조하십시오. – Junuxx

+0

** if ** 문 앞에 ** QApplication.processEvents() **에 대한 호출을 추가했지만 불행히도 작동하지 않았습니다. –

+3

'processEvents()'가 차단 부분으로 가야합니다. 'make_movie'는이 경우에 사용됩니다. 문제를 해결할 수도 있고하지 않을 수도있는'make_movie' 구현에 따라. 또는 해당 부분을 다른 스레드로 이동할 수 있습니다. – Avaris

답변

2

교훈 : 장기 실행 작업이있는 경우 (예 : 파일을 읽거나 쓰는 경우) 다른 스레드로 이동 시키면 UI가 고정됩니다.

class MovieMaker(QThread): 
    def __init__(self, uAppStatus, uFilename): 
     QtCore.QThread.__init__(self, parent=None) 
     self.appStatus = uAppStatus 
     self.filename = uFilename 

    def run(self): 
     ## make the movie and save it on file 

이의 다시 saveMovie 방법으로 이동하자

따라서, 나는 그 run 방법와 previosly make_movie에 의해 구현되는 기능을 캡슐화 QThread, MovieMaker의 서브 클래스를 만들었습니다. 여기에, 나는 다음과 같은 코드로 make_movie에 원래 통화를 대체 : 나는 새로운 신호, Progress(int)을 정의

self.mm = MovieMaker(self.appStatus, 
        filename) 

self.connect(self.mm, QtCore.SIGNAL("Progress(int)"), 
      self.updateProgressDialog) 

self.mm.start() 

참고 방법에 대해 설명합니다.
이러한 신호는 MovieMaker 스레드에 의해 방출되어 QProgressDialog을 사용하여 영화 인코딩 작업 진행 상황을 사용자에게 표시합니다.

관련 문제