2017-03-10 15 views
0

こんにちは、QThreadクラスを使用してスレッドを作成する際に問題があります。 は、ここに私のコードです:PyQt QThreadによりメインスレッドが終了する

import sys 
from PyQt5.QtWidgets import QApplication, QWidget 
from PyQt5.QtCore import QThread 

class ScriptRunner(QThread): 

    def run(self): 
     print('test') 


if __name__ == '__main__': 

    app = QApplication(sys.argv) 
    gui = QWidget() 
    gui.setFixedSize(400, 400) 
    gui.setVisible(True) 

    ScriptRunner().start() # this line cause the error 

    sys.exit(app.exec_()) 

とき、私のランチScriptRunner().start()行せずにこのコード、GUIは何の問題もなく働いているが、私は行を追加しない場合、GUIが現れ、非常に迅速かつプログラムに隠されています

/usr/bin/python3.6 /home/karim/upwork/python-qt-rasp/tests/test.py 
QThread: Destroyed while thread is still running 

Process finished with exit code 134 (interrupted by signal 6: SIGABRT) 

答えて

1

ラインを変更してください:シャットダウンは、私は、コンソールにこのメッセージが表示さ

ある

ScriptRunner().start() # this line cause the error 

sr = ScriptRunner() 
sr.start() 

はしかしPyQt4のためにテストされたが、動作します。

EDIT:私のために働いた

別の回避策:ScriptRunner(gui).start()としてScriptRunnerをインスタンス化

も動作します。

+0

なぜそれが問題ですか?これらの2つの線は最初の線とまったく同じです。 2番目の編集はうまくいきましたが、なぜスレッドの親を指定する必要があるのか​​知っていますか? – karim

+0

残念ながら、私はあなたの元のアプローチで何が問題であるか分かりません。 – Szabolcs

+0

ありがとうございました:) – karim

1

問題は、実際の世界の例では、自分のオブジェクトのスレッドへの参照を保存していないので、昼食のスレッドへの参照を保存しなければならないということでした。

self.runner = Runner() 
+0

これは正しいです –

関連する問題