2016-07-05 2 views
0

프로젝트 작업 중 이상한 문제가 발생했습니다. 나는 GUI와 상태 브라우저 역할을하는 QTextEdit을 가지고있다. 버튼을 클릭하면 별도의 스레드에서 다른 기능이 발생하는 동안 QTextEdit에서 10 초 카운트 다운을 표시합니다. 매초 신호를 내 보내지 만 QTextEdit은 9 초 동안 정지 한 다음 마지막 카운트 다운 번호를 표시합니다.PyQt4 : 마지막 신호 만 처리 중입니다.

나는 이것이 별도의 스레드에서 일어나는 일과 관련이 있다고 생각 했으므로 이것을 테스트하기 위해 별도의 예제를 만들었습니다. 간단한 예제에서는 QTextEdit과 Button 두 가지가 있습니다. 버튼을 클릭하면 상태 브라우저에 '5'가 2 초간 표시된 다음 '4'가 표시됩니다. 여기

코드입니다 :

import sys 
from PyQt4 import QtGui, uic 
from PyQt4.QtCore import QObject, pyqtSignal 
import time 

class MainUI(QObject): 
    status_signal = pyqtSignal(str) 

    def __init__(self, window): 
     super(QObject, self).__init__() 
     self.ui = uic.loadUi(r'L:\internal\684.07\Mass_Project\Software\PythonProjects\measure\testing\status_test.ui', window) 

     self.ui.statusBrowser.setReadOnly(True) 
     self.ui.statusBrowser.setFontPointSize(20) 

     self.status_signal.connect(self.status_slot) 
     self.ui.button.clicked.connect(self.counter) 

     window.show() 

    def status_slot(self, message): 
     self.ui.statusBrowser.clear() 
     self.ui.statusBrowser.append(message) 

    def counter(self): 
     print 'clicked' 
     i = 5 
     self.status_signal.emit(str(i)) 
     time.sleep(2) 
     self.status_signal.emit(str(i-1)) 


if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    app.setStyle("cleanlooks") 
    main_window = QtGui.QDialog() 
    main_ui = MainUI(main_window) 
    sys.exit(app.exec_()) 

이 예에서, 같은 일이 발생합니다. 상태 브라우저는 2 초 동안 정지 한 다음 '4'만 표시합니다. status_slot 함수를 변경하여 추가하기 전에 상태 브라우저를 지우지 않으면 상태 브라우저는 2 초 동안 기다린 다음 두 신호를 동시에 내보내고 '5 \ n 4'를 표시합니다. 왜 이런 일이 일어나고 디스플레이를 지속적으로 업데이트 할 수 있는지 알 수 있습니까? 미리 감사드립니다!

답변

1

time.sleep()은 Qt 메인 루프를 차단하므로 윈도우 다시 그리기 이벤트를 처리 할 수 ​​없습니다. QTimer을 사용하여 시그널을 발생시키는 메소드를 주기적으로 호출하여 컨트롤이 Qt 이벤트 루프로 정기적으로 리턴되도록하십시오.

+0

고마워요! 나는 그것을 사용하여 시도하고 훌륭한 상태 브라우저를 업데이 트에 대한 작품. 상태 브라우저가 카운트 다운되는 동안 해당 스레드를 지연시키고 싶었 기 때문에'time.sleep (sec)'과 유사한'QTest.qWait (msec)'를 보았지만 GUI가 정지되지는 않았습니다. 그런 걸 찾고 있어요. –