2016-07-05 12 views
0

私のプロジェクトで作業中に奇妙な問題が発生しました。私は、ステータスブラウザとして機能するGUIとQTextEditを持っています。ボタンをクリックすると、別のスレッドで別の関数が起きている間にQTextEditに10秒のカウントダウンが表示されます。毎秒シグナルを出しても、QTextEditは9秒間ハングし、最後のカウントダウン番号を表示します。PyQt4:最後の信号だけが処理されています

これは別のスレッドで起こっていることと関係があると思ったので、これをテストする別の例を作成しました。私の簡単な例では、QTextEditとButtonという2つのことがあります。ボタンをクリックするとステータスブラウザに「5」が2秒間表示され、「4」が表示されます。ここで

コードです:

import sys 
from PyQt4 import QtGui, uic 
from PyQt4.QtCore import QObject, pyqtSignal 
import time 

class MainUI(QObject): 
    status_signal = pyqtSignal(str) 

    def __init__(self, window): 
     super(QObject, self).__init__() 
     self.ui = uic.loadUi(r'L:\internal\684.07\Mass_Project\Software\PythonProjects\measure\testing\status_test.ui', window) 

     self.ui.statusBrowser.setReadOnly(True) 
     self.ui.statusBrowser.setFontPointSize(20) 

     self.status_signal.connect(self.status_slot) 
     self.ui.button.clicked.connect(self.counter) 

     window.show() 

    def status_slot(self, message): 
     self.ui.statusBrowser.clear() 
     self.ui.statusBrowser.append(message) 

    def counter(self): 
     print 'clicked' 
     i = 5 
     self.status_signal.emit(str(i)) 
     time.sleep(2) 
     self.status_signal.emit(str(i-1)) 


if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    app.setStyle("cleanlooks") 
    main_window = QtGui.QDialog() 
    main_ui = MainUI(main_window) 
    sys.exit(app.exec_()) 

この例では、同じことが起こります。ステータスブラウザは2秒間ハングし、「4」と表示されます。 status_slot関数を変更して、追加する前にステータスブラウザをクリアしないようにすると、ステータスブラウザは2秒間待ってからすぐに両方の信号を出力し、 '5 \ n 4'と表示します。なぜこれが起こっているのか、誰かがいつもディスプレイを更新するために何ができるのか分かっていますか?前もって感謝します!

答えて

1

time.sleep()は、Qtメインループをブロックして、ウィンドウの再描画イベントを処理できないようにします。 QTimerを使用して定期的に信号を発信するメソッドを呼び出し、制御がQtイベントループに定期的に返されるようにします。

+0

ありがとうございました!私はそれを使用しようとし、それはステータスブラウザを更新するために素晴らしい動作します。ステータスブラウザがダウンしている間にそのスレッドを遅らせたいので、 'time.sleep(sec)'に似ていますが、誰かがあればGUIをフリーズしない 'QTest.qWait(msec)'も出てきました。そのようなものを探している –

関連する問題