2017-02-16 3 views
0

Pyqt5 Pythonコードの単純な進捗状況ラベルを作成し、関数がたくさんの機能を果たすループの繰り返しごとに更新しようとしています。私が更新したいラベルは "status_label_counter"です。以下のコードは、ラベルを作成する部分と、私が述べた機能を使用したい場所を示しています。Pythonのランタイム進行状況(ステータスバーなど)

#initialisation code, etc... 

    self.status_label_counter = QLabel() 
    self.status_label_from = QLabel(' from: ') 
    self.status_label_total = QLabel() 
    status_hbox = QHBoxLayout() 
    status_hbox.addStretch() 
    status_hbox.addWidget(self.status_label_counter) 
    status_hbox.addWidget(self.status_label_from) 
    status_hbox.addWidget(self.status_label_total) 
    status_hbox.addStretch() 

    #bunch of other code... 

    def create_ics(self): 
     counter = 0 
     self.status_label_total.setText(str(len(self.groups))) 
     for group in self.groups: 
      #does a bunch of stuff inside 
      group_manager.create_calendar_for(self.rows, group, self.term) 
      counter += 1 
      #for console output 
      print('iteration: ', counter) 
      #trying to update status counter 
      self.status_label_counter.setText(str(counter)) 

問題は、ネストされた関数でループが完了したときに両方のラベルの更新が表示されることです。 "create_ics"を呼び出すボタンをクリックすると、関数ウィンドウが約5秒間非アクティブになり、コンソールのログに反復回数が表示されますが、何も表示されません。

+0

(QApplication.processEventsを試してみてください)ループ – eyllanesc

+0

の内側に、私はまた、処理の時間は、ほぼ倍増したが、私はそれがこの特定のケースで動作することがわかり、私は)(QApplication.processEventsを使用し、それが働いたQThread – eyllanesc

答えて

1

ビュー(Qt)はメインスレッドでロックされていて、イベントループを処理して自身を再描画することはありません。あなたが本当にそれをこのように実行したい場合は、呼び出し:

self.status_label_counter.repaint() 

をあなたはテキストを設定した後(とあなたの代わりにコールQApplication.processEvents()を測定するいくつかの複雑なレイアウトを持っている場合)。

ただし、あなたのcreate_ics()関数を別のスレッドで実行して、メインスレッドがビューとQtのイベント処理を処理するようにする方がはるかに優れています。標準的なPythonのthreadingモジュールを使うか、Qt独自のQThread:https://nikolak.com/pyqt-threading-tutorial/を使って実行できます。

+0

を使用することをお勧めしますそれは数秒の問題ですから、スレッドの試行もします。なぜなら、アイテムの数が今のように〜200ではなく、〜5000であれば、実際には問題になるからです。ありがとう! –

+0

処理時間はもちろん増加します - 本当に必要でないにもかかわらず、各呼び出しでQtのイベントループチェックを初期化しているので、スレッドが便利です - Qtのイベントループには独自のスケジュールがあり、定期的に更新しますあなたの場合、それはあなたのループで立ち往生します。処理を別のスレッドに分けると、Qtが更新されるのを妨げるものはありません。 Qtプロセスイベントを処理する必要がある場合は、条件を追加するだけでスレッド処理なしで処理速度を向上させることもできます(例:カウンタが%1000でない場合:QApplication.processEvents() – zwer

関連する問題