3

基本的に、PySide qt フレームワークで基本的な hello world プログラムを作成するプログラムがあります。違いは、呼び出されるprint("loop")前に while ループで実行されることです。exec_()ユーザーがプログラムを完了するまでループが終了しないという問題があるため、ループが終了したexec_()ときにのみ呼び出されます。

私の問題は、このように実行するprint("loop")と実行されるが、ウィンドウが応答せず、「Hello, loop!」と表示されないことです)。qt_app.exec_()の下にインデントするwhile running:と、ウィンドウは応答しますが、ウィンドウをprint("loop")閉じる前に 1 回だけ実行され、ウィンドウを閉じた後に 1 回だけ実行されます。

コンソールに複数回印刷「ループ」している間、メインウィンドウが応答できるようにする必要があります。

import sys

from PySide.QtCore import *
from PySide.QtGui import *
qt_app = QApplication(sys.argv)
label = QLabel('Hello, loop!')
label.show()

running = True #only set to False when user is done with app in the real code.

while running:

  #I am handling connections here that MUST be in continual while loop
  print("loop")

qt_app.exec_()
4

1 に答える 1

2

GUI アプリケーションが必要な場合は、GUI イベント ループにメイン スレッドを引き継がせる必要があります。

問題の解決策は、qt イベント ループにメイン スレッドを引き継がせながら、印刷を行う別のスレッドを作成することです。

あなたのスレッドはバックグラウンドで実行され、それを実行し、(デーモンに設定したため)アプリケーションが終了するか、running変数がに設定されると停止しますFalse

import sys
import time
import threading

from PySide.QtCore import *
from PySide.QtGui import *
qt_app = QApplication(sys.argv)
label = QLabel('Hello, loop!')
label.show()

running = True #only set to False when user is done with app in the real code.

def worker():
    global running
    while running:
        #I am handling connections here that MUST be in continual while loop
        print("loop")
        time.sleep(0.5)

thread = threading.Thread(target=worker)
thread.setDaemon(True)
thread.start()

qt_app.exec_()

しかし、これは悪い例です。スレッドでロックせずにグローバル可変変数を使用するべきではないからです

于 2013-08-24T20:29:56.507 に答える