2017-11-15 13 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.S. (前にこの質問をしましたが、回答やコメントや低い見解がないので、削除して再度質問しています)

+1

あなたがInitThreadとMainDisplayの実装を示さなければなりません。 – eyllanesc

+0

時間、天気、ニュースとは何ですか?あなたは、検証可能な手段が何かを理解しています。 – eyllanesc

+0

このタイプの問題では、回答できる可能性が低い場合、githubなどでプロジェクトを共有した場合、実行可能なコードを助けたり、少なくとも共有することができます。 – eyllanesc

答えて

1

pythonはスレッドを通してタスクを実行するいくつかの方法を提供しますが、 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

私はあなたのコードを実行したときに私は 'run()'でエラーが発生しました。それは 'DoStuffThreadオブジェクトには属性 "stuff"がありません。私は 'stuff'が 'onTimeout'で明確に定義されているので、何が間違っているのか分かりません。 – Sebiancoder

+0

@Sebiancoder私はそれをテストせずに修正を加えましたが、修正しました。 – eyllanesc

関連する問題