私のプロジェクトで作業中に奇妙な問題が発生しました。私は、ステータスブラウザとして機能する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'と表示します。なぜこれが起こっているのか、誰かがいつもディスプレイを更新するために何ができるのか分かっていますか?前もって感謝します!
ありがとうございました!私はそれを使用しようとし、それはステータスブラウザを更新するために素晴らしい動作します。ステータスブラウザがダウンしている間にそのスレッドを遅らせたいので、 'time.sleep(sec)'に似ていますが、誰かがあればGUIをフリーズしない 'QTest.qWait(msec)'も出てきました。そのようなものを探している –