regepanのはてなブログ

個人的なメモ帳レベルの文章。

PySide6でスレッドを使う。

code.tiblab.net
こちらの記事のサンプルコードがすごくわかりやすかったので参考にさせて頂いた。ありがとうございます。
結果、ファイル選択ダイアログのフリーズを回避し、ダイアログを閉じた後(同時?)に処理を走らせることが出来た。
pythonではマルチコアを使用することは出来ないとどこかで見たけど、マルチスレッドってどういう仕組なのだろう。

import sys
import time
from PySide6 import QtCore, QtWidgets
from PySide6.QtWidgets import (QHBoxLayout)


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, *argv, **keywords):
        super(MainWindow, self).__init__(*argv, **keywords)
        self.move(0, 0)

        layout = QHBoxLayout()

        self.label = QtWidgets.QLabel(self)
        self.label.move(10, 5)
        layout.addWidget(self.label)

        self.label_2 = QtWidgets.QLabel(self)
        self.label_2.move(10, 30)
        layout.addWidget(self.label_2)

        self.setLayout(layout)

        self.thread = TestProcess(self)
        self.thread.signal.connect(self.setText)
        self.thread.start()

        self.thread_2 = TestProcess_2(self)
        self.thread_2.signal.connect(self.setText_2)
        self.thread_2.start()

    def setText(self, n):
        self.label.setText(str(n))

    def setText_2(self, n):
        self.label_2.setText(str(n))


class TestProcess(QtCore.QThread):
    signal = QtCore.Signal(int)

    def run(self):
        n = 0
        while n <= 100:
            self.signal.emit(n)
            time.sleep(0.1)
            n += 1


class TestProcess_2(QtCore.QThread):
    signal = QtCore.Signal(int)

    def run(self):
        n = 0
        while n <= 100:
            print("start emit")
            self.signal.emit(n)
            print("end emit")
            time.sleep(1)
            n += 1


def main():
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()

    w.show()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

処理の流れ