2012-03-08 12 views
1

qtwidgetを表示してからforloopを実行してコードを実行したい場合は、 を実行しますが、forloopを実行してから私のウィジェットを表示します。どうしてこれなの?PyQtランタイムの問題

class tes(QWidget): 

    def __init__(self): 
     super(tes, self).__init__() 
     self.initUI() 
     for i in range (1000000): 
      print("s") 

    def initUI(self): 
     t = QTableWidget(8,8,self)   
     self.show() 
     self.resize(1000,1000) 
     t.setGeometry(0,0,500,500) 
     t.show() 

def main(): 
    app = QApplication(sys.argv) 
    t = tes() 
    sys.exit(app.exec_()) 

if __name__ == "__main__": 
    main() 
+0

これは、「表示」が 'app.exec _()'行に(つまり、メインループが起動したとき)起きているからです。私はあなたが何をしようとしているのかを明確にする必要があると思います。 – Avaris

答えて

0

あなたがapp.exec_()を実行するため、forループtesオブジェクトの初期化時に実行した後、それはです。

6

ループの前にQApplication.processEvents()を追加します。あなたのウィジェットは表示されますが、応答しません。アプリケーションを応答させるには、ループのいくつかのステップにprocessEvents()コールを追加します。

例:

def __init__(self): 
    super(tes, self).__init__() 
    self.initUI() 
    QApplication.processEvents() 
    for i in range (1000000): 
     if not i % 3: # let application process events each 3 steps. 
      QApplication.processEvents() 
     print("s") 
+0

そう、私はそんなことを解決した。 cheers – K100

+1

'self.initUI()'を呼び出すと、生成されたイベント(showEventなど)がイベントキューにキューイングされますが、イベントループはまだ開始されていません。 'processEvents()'を呼び出すと、キューを手動でフラッシュします。 – jdi

0

ウィジェットのみ、その初期化時に、アプリケーションではなく、実行されると示されています。あなたはループの中で正確に何をしようとしていますか?イベントにシグナルを接続したり、イベントを処理したりする方が良いかもしれませんが、それはすべてあなたが達成しようとしていることに依存しています。

関連する問題