PyQtで、メインウィンドウとスレッド間でデータを共有するための最良の方法は何ですか

エミル

私はPyQt4を使用して最初のGUIアプリケーションを作成している最中で、非常に基本的な質問に出くわしましたが、良い答えが見つからないようです。

スレッドを使用して、メインウィンドウをブロックせずに繰り返しタスクを継続的に実行しています。スレッドには、メインウィンドウからの情報(スピンボックスの現在の値など)が必要です。これらの情報は、スレッドの実行中にも変更される可能性があります。この状況で、メインウィンドウとスレッドの間でそのようなデータを共有する適切な方法は何ですか?

素朴に、私は次の可能性を思い付くことができました:

  1. ホストウィンドウへの参照をスレッドに渡し、これを使用して問題の変数の現在の値を取得します(以下の例を参照)。
  2. 変数のコピーをスレッドに保持し、変数が変更されるたびにシグナルを発行することで、メインウィンドウとの同期を維持します。
  3. グローバル変数を使用します。

3つのオプションはすべて私の特定のユースケースで機能する可能性が高いですが(2つは少し複雑ですが)、より良い/よりPythonic /よりQtのような方法があるはずだと感じています。

これは私がやりたいことを説明する最小限の作業例です。この場合はオプション1を使用します。

from PyQt4 import QtGui, QtCore
import time, sys

class MainWindow(QtGui.QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.layout = QtGui.QVBoxLayout(self)
        self.spinbox = QtGui.QSpinBox(self)
        self.spinbox.setValue(1)
        self.layout.addWidget(self.spinbox)
        self.output = QtGui.QLCDNumber(self)
        self.layout.addWidget(self.output)

        self.worker = Worker(self)
        self.connect(self.worker, QtCore.SIGNAL('beep'), self.update)
        self.worker.start()

    def update(self, number):
        self.output.display(number)


class Worker(QtCore.QThread):
    def __init__(self, host_window):
        super(Worker, self).__init__()
        self.host = host_window
        self.running = False

    def run(self):
        self.running = True
        i = 0
        while self.running:
            i += 1
            self.emit(QtCore.SIGNAL('beep'), i)
            sleep_time = self.host.spinbox.value()
            time.sleep(sleep_time)

    def stop(self):
        self.running = False


app = QtGui.QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()

PS:私はPyQtにまったく慣れていないので、コードに他の問題があるか、質問が不明確である可能性は低いとは言えません。この場合、質問にコメントまたは編集してください。

メル

ウィジェットはスレッドセーフではありません。スレッドとQObjectを参照してください

QObjectは再入可能ですが、GUIクラス、特にQWidgetとそのすべてのサブクラスは再入可能ではありません。メインスレッドからのみ使用できます。

そして、ここでより多くの定義を参照してください:再入可能性とスレッドセーフ


メインスレッドではウィジェットのみを使用し、シグナルとスロットを使用して他のスレッドと通信する必要があります。

グローバル変数が機能するとは思いませんが、正直なところ理由はわかりません。


この例でシグナルを使用する方法:

#in main
self.worker = Worker(self.spinbox.value())
self.worker.beep.connect(self.update)
self.spinbox.valueChanged.connect(self.worker.update_value)

class Worker(QtCore.QThread):
    beep=QtCore.pyqtSignal(int)

    def __init__(self,sleep_time):
        super(Worker, self).__init__()
        self.running = False
        self.sleep_time=sleep_time

    def run(self):
        self.running = True
        i = 0
        while self.running:
            i += 1
            self.beep.emit(i)
            time.sleep(self.sleep_time)

    def stop(self):
        self.running = False

    def update_value(self,value):
        self.sleep_time=value

注意:新しいスタイルの信号とスロットを使用しています

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

データベース内のテーブル間で共有フィールドを維持するための最良の方法は何ですか?

分類Dev

Arc <Mutex <T >>がRustのスレッド間でデータを共有するための最良の方法ではないのはどの場合ですか?

分類Dev

Qtの2つのウィンドウ間で通信するための最良の方法は何ですか

分類Dev

Node Webkitのウィンドウ間でデータを共有する方法は?

分類Dev

ウィンドウのすべてのUI要素を取得するための最良の方法は何ですか?

分類Dev

ログインしたユーザーのレコードのみを表示するマルチユーザーログインを共有データベースに設定するための最良の方法は何ですか?

分類Dev

Pygameウィンドウを再描画するための最良の方法は何ですか?

分類Dev

ドロップダウンを作成し、URLからJSONデータを動的にフェッチするための最良の方法は何ですか

分類Dev

他のレイアウトのリストを使用してコーディングするための最良の方法は何ですか?

分類Dev

複数のスレッド間で共有したい静的オブジェクトを初期化するための最良の方法は何ですか

分類Dev

カウントダウンタイマーを作るための最良の方法は何ですか?

分類Dev

バックグラウンドでタスクを実行するための最良の方法は何ですか(application_startからのスレッドまたは呼び出しメソッド)?

分類Dev

コンポーネント間でユーザーデータを共有するための最良の方法は何ですか?

分類Dev

Phaser3クラスメソッド間で変数を共有するための最良の方法は何ですか?

分類Dev

モバイルサイト用のダウンロード可能なストアカードを作成するための最良の方法は何ですか?

分類Dev

ダッシュボードとランディングを備えたReactアプリケーションでCSSスタイルの競合に対処するための最良の方法は何ですか?

分類Dev

PHPテンプレートのヘッドセクションにメタタグを含めるための最良の方法は何ですか?

分類Dev

doGetメソッドとJSPページの間で通信するための最良の方法は何ですか?

分類Dev

Springセキュリティでセッションがタイムアウトしたときにリクエストで見つかった無効なCSRFトークンを処理するための最良の方法は何ですか

分類Dev

AngularサービスでバックエンドAPIからのデータを操作するための最良の方法は何ですか?

分類Dev

異なるhttpドメインの親ウィンドウと子ウィンドウの間でデータを通信する方法は?

分類Dev

センサーのレジスタのフィールドの詳細を保存するための最良の方法は何ですか?

分類Dev

複数のサービス間でdbcontextを共有するための最良の方法は何ですか?

分類Dev

この「インスタンスメソッドから静的フィールドに書き込む」findbugs警告を修正する最良の方法は何ですか?

分類Dev

Android:繰り返しのバックグラウンドタスクをAndroid Oreoに対応させるための最良の方法は何ですか?

分類Dev

デリゲートは、2つのウィンドウ間で変数を共有するための優れたアプローチですか?

分類Dev

このカスタムレイアウトを作成するための最良の方法は何ですか– IOS?

分類Dev

ドライブをパーティション分割するための最良の方法は何ですか?

分類Dev

アマゾンウェブサービスSQSからのメッセージをポーリングするための最良の方法は何ですか

Related 関連記事

  1. 1

    データベース内のテーブル間で共有フィールドを維持するための最良の方法は何ですか?

  2. 2

    Arc <Mutex <T >>がRustのスレッド間でデータを共有するための最良の方法ではないのはどの場合ですか?

  3. 3

    Qtの2つのウィンドウ間で通信するための最良の方法は何ですか

  4. 4

    Node Webkitのウィンドウ間でデータを共有する方法は?

  5. 5

    ウィンドウのすべてのUI要素を取得するための最良の方法は何ですか?

  6. 6

    ログインしたユーザーのレコードのみを表示するマルチユーザーログインを共有データベースに設定するための最良の方法は何ですか?

  7. 7

    Pygameウィンドウを再描画するための最良の方法は何ですか?

  8. 8

    ドロップダウンを作成し、URLからJSONデータを動的にフェッチするための最良の方法は何ですか

  9. 9

    他のレイアウトのリストを使用してコーディングするための最良の方法は何ですか?

  10. 10

    複数のスレッド間で共有したい静的オブジェクトを初期化するための最良の方法は何ですか

  11. 11

    カウントダウンタイマーを作るための最良の方法は何ですか?

  12. 12

    バックグラウンドでタスクを実行するための最良の方法は何ですか(application_startからのスレッドまたは呼び出しメソッド)?

  13. 13

    コンポーネント間でユーザーデータを共有するための最良の方法は何ですか?

  14. 14

    Phaser3クラスメソッド間で変数を共有するための最良の方法は何ですか?

  15. 15

    モバイルサイト用のダウンロード可能なストアカードを作成するための最良の方法は何ですか?

  16. 16

    ダッシュボードとランディングを備えたReactアプリケーションでCSSスタイルの競合に対処するための最良の方法は何ですか?

  17. 17

    PHPテンプレートのヘッドセクションにメタタグを含めるための最良の方法は何ですか?

  18. 18

    doGetメソッドとJSPページの間で通信するための最良の方法は何ですか?

  19. 19

    Springセキュリティでセッションがタイムアウトしたときにリクエストで見つかった無効なCSRFトークンを処理するための最良の方法は何ですか

  20. 20

    AngularサービスでバックエンドAPIからのデータを操作するための最良の方法は何ですか?

  21. 21

    異なるhttpドメインの親ウィンドウと子ウィンドウの間でデータを通信する方法は?

  22. 22

    センサーのレジスタのフィールドの詳細を保存するための最良の方法は何ですか?

  23. 23

    複数のサービス間でdbcontextを共有するための最良の方法は何ですか?

  24. 24

    この「インスタンスメソッドから静的フィールドに書き込む」findbugs警告を修正する最良の方法は何ですか?

  25. 25

    Android:繰り返しのバックグラウンドタスクをAndroid Oreoに対応させるための最良の方法は何ですか?

  26. 26

    デリゲートは、2つのウィンドウ間で変数を共有するための優れたアプローチですか?

  27. 27

    このカスタムレイアウトを作成するための最良の方法は何ですか– IOS?

  28. 28

    ドライブをパーティション分割するための最良の方法は何ですか?

  29. 29

    アマゾンウェブサービスSQSからのメッセージをポーリングするための最良の方法は何ですか

ホットタグ

アーカイブ