30秒以上かかるデータをロードしようとしています。この間、私はユーザーに "Loading ..."、次に "Loading .."、 "Loading ..."、そして "Loading"という小さなGUIを見てほしい。私はいくつかの読書をして、私は別のスレッドでこれを入れなければならないと思う。私は解決策を示唆し、同様の問題を持っていた人を見つけたこの権利スポットで:私はテスト機能PyQt5スレッドGUIが動作しない
def test(self):
tmp = InfoMessage()
while True:
print(1)
とInfoMessage機能を持っているファイルの下部に
t = threading.Thread(target=self.test)
t.daemon = True
t.start()
from PyQt5 import uic, QtCore, QtGui, QtWidgets
import sys
class InfoMessage(QtWidgets.QDialog):
def __init__(self, msg='Loading ', parent=None):
try:
super(InfoMessage, self).__init__(parent)
uic.loadUi('ui files/InfoMessage.ui',self)
self.setWindowTitle(' ')
self.o_msg = msg
self.msg = msg
self.info_label.setText(msg)
self.val = 0
self.timer = QtCore.QTimer()
self.timer.setInterval(500)
self.timer.timeout.connect(self.update_message)
self.timer.start()
self.show()
except BaseException as e:
print(str(e))
def update_message(self):
self.val += 1
self.msg += '.'
if self.val < 20:
self.info_label.setText(self.msg)
else:
self.val = 0
self.msg = self.o_msg
QtWidgets.QApplication.processEvents()
def main():
app = QtWidgets.QApplication(sys.argv) # A new instance of QApplication
form = InfoMessage('Loading ') # We set the form to be our MainWindow (design)
app.exec_() # and execute the app
if __name__ == '__main__': # if we're running file directly and not importing it
main() # run the main function
InfoMessage関数を単独で実行すると、正常に動作し、0.5秒ごとに更新されます。ただし、読み込みファイルの一部としてこれを楽しむと、GUIは空白であり、表示されます。私はそれがそこのprintステートメントのためにテスト機能にとどまっていることを知っています。
誰かが正しい方向に向かうことができますか?私はいくつかのステップを欠いていると思う。
ありがとうございました。私はそれを使って遊び始めますが、あなたはすでにそれがどのように機能するのか理解してくれたことは間違いありません。もし私がそれを理解できなければ、私は連絡を取ります。もう一度ありがとう –
メッセージを表示しているスレッドをいつ停止するかを知るために、terminate/kill/closeコマンドを追加するにはどうしたらいいですか?現在のところそれが続き、制限に達すると停止しません。処理時間が変わるため、時間ベースではないようにします。私はセットアップをする必要があると思う.exit()スレッドのために私は傾けるが、これを動作させるようです。 –
@MrRCタスクが完了すると、ロードダイアログの更新が自動的に停止するようにコードを更新しました。 QThreadシグナル['finished()']を使う(http://doc.qt.io/qt-4.8/qthread.html#finished)。これは、タスクがバックグラウンドで実行されているときに進行状況を更新する最善の方法です。これは、組み込みのメソッドでは通常、[GIL](https://wiki.python.org/moin/GlobalInterpreterLock)のコード実行をブロックするためです。 – daegontaven