2017-11-15 31 views
-1

다른 기능이 실행되는 동안 내 pyside 프로그램의 시작 부분에 로딩 그래픽 (현재 레이블 만 있음)을 표시하려고합니다. 작업이 끝나면 계속 진행하고 기본 GUI를로드해야합니다. 나는이 지금까지스레딩을 사용하여 PySide에서 로딩 표시 만들기

from PySide import QtCore 
from PySide import QtGui 

class DoStuff: 
    def __init__(self): 
     pass 

    def ReturnInformation(self): 
     time.sleep(20)        #Sleep to simulate processing time 
     return "information" 

class Main(QtGui.QWidget): 
    def __init__(self): 
     super(Main, self).__init__() 
     self.initQ = queue.Queue() 
     self.initthread = threading.Thread(target=self.InitThread) 
     self.initthread.daemon = True 
     self.initthread.start() 

     self.setStyleSheet("background-color: black;") 
     self.setCursor(QtCore.Qt.BlankCursor) 

     self.loaddisplay = QtGui.QLabel(self) 
     self.loaddisplay.move(20, 20) 
     self.loaddisplay.setText("Loading...") 
     self.show() 

     self.initthread.join() 
     self.MainDisplay() 
     self.show() 

    def InitThread(self): 
     self.dostuff = DoStuff() 


    def MainDisplay(self): 
     self.display = QtGui.QLabel(self) 
     self.display.setStyleSheet("font: 70pt Helvetica; color: white;") 
     self.display.move(20, 20) 
     self.display.setText(self.dostuff.ReturnInformation()) 

     self.manager = QtCore.QTimer(self) 
     self.manager.timeout.connect(self.Update) 
     self.manager.start(100000) 

    def Update(self):             #Update the information once in a while 
     self.timedisplay.setText(self.dostuff.ReturnInformation()) 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    GUI = Main() 
    sys.exit(app.exec_()) 

문제는 부하 그래픽이 표시되고 MainDisplay()에서 GUI가 표시되지 않습니다 것입니다 있습니다. 나는 이것이 내가 어떻게 show() 함수라고 부르는 지와 관련이 있다고 확신한다. 그게 문제이며, 어떻게 고칠 수 있습니까?

또한로드가 끝나면 어떻게로드 라벨을 삭제할 수 있습니까?

P. (나는이 질문을하기 전에 물어 보았지만 아무런 대답이나 코멘트가없고 낮은보기가있어서 삭제하고 질문을 다시한다.)

+1

당신은 InitThread 및 MainDisplay의 구현을 표시해야합니다. – eyllanesc

+0

시간, 날씨, 뉴스는 무엇입니까? 당신은 검증 할 수있는 무엇을 의미하는지 이해합니다. – eyllanesc

+0

이 유형의 문제는 응답 할 가능성이없는 경우 복제 할 수있는 코드를 제공해야하며 github 또는 유사품을 통해 프로젝트를 공유하거나 실행될 수있는 코드를 공유 할 수 있어야합니다. – eyllanesc

답변

1

파이썬은 스레드를 통해 작업을 실행하는 몇 가지 방법을 제공하지만 반드시 규칙 Qt는, 같은 QThread 같은 프레임 워크의 도구를 사용하는 것이 적절하다 : 당신은 우리가 당신을 돕고 싶어하거나 당신이 MVCE를 제공해야하는 경우

class DoStuffThread(QtCore.QThread): 
    displaySignal = QtCore.Signal(str) 
    timeSignal = QtCore.Signal(str) 

    def __init__(self, *args, **kwargs): 
     QtCore.QThread.__init__(self, *args, **kwargs) 

     self.timer = QtCore.QTimer() 
     self.timer.moveToThread(self) 
     self.timer.timeout.connect(self.onTimeout) 
     self.stuff = DoStuff() 

    def onTimeout(self): 
     data = self.stuff.ReturnInformation() 
     self.timeSignal.emit(data) 

    def run(self): 
     data = self.stuff.ReturnInformation() 
     self.displaySignal.emit(data) 
     self.timer.start(20000) 
     loop = QtCore.QEventLoop() 
     loop.exec_() 


class DoStuff: 
    def ReturnInformation(self): 
     time.sleep(2) # Sleep to simulate processing time 
     return "information-{}".format(QtCore.QTime.currentTime().toString("hh:mm:ss")) 


class Main(QtGui.QWidget): 
    def __init__(self): 
     super(Main, self).__init__() 
     self.setStyleSheet("background-color: black;") 
     self.setCursor(QtCore.Qt.BlankCursor) 
     self.setLayout(QtGui.QVBoxLayout()) 

     self.loaddisplay = QtGui.QLabel(self) 
     self.display = QtGui.QLabel(self) 
     self.timedisplay = QtGui.QLabel(self) 

     self.layout().addWidget(self.loaddisplay) 
     self.layout().addWidget(self.display) 
     self.layout().addWidget(self.timedisplay) 

     self.thread = DoStuffThread(self) 
     self.thread.displaySignal.connect(self.display.setText, QtCore.Qt.QueuedConnection) 
     self.thread.timeSignal.connect(self.timedisplay.setText, QtCore.Qt.QueuedConnection) 
     self.thread.start() 

     self.loaddisplay.move(20, 20) 
     self.loaddisplay.setText("Loading...") 
     self.display.setStyleSheet("font: 70pt Helvetica; color: white;") 
     self.display.move(20, 20) 

    def closeEvent(self, event): 
     self.thread.quit() 
     QtGui.QWidget.closeEvent(self, event) 


if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    GUI = Main() 
    GUI.show() 
    sys.exit(app.exec_()) 
+0

코드를 실행하면 '실행()'오류가 발생했습니다. DoStuffThread 객체에는 "stuff"속성이 없습니다. 나는 '물건'이 'onTimeout'에 명확하게 정의되어있어 무엇이 잘못되었는지를 알 수 없다는 것을 알 수 있습니다. – Sebiancoder

+0

@Sebiancoder 나는 그것을 테스트하지 않고 수정했다. 그러나 나는 그것을 바로 잡았다. 다시 확인해 보라. – eyllanesc