マルチスレッドでUIの変更

2020/12/30

Python 3.8.2,PySide2 5.15.2

重い処理等をする際に、マルチスレッドでプロセスを回しつつ、画面を更新するには、シグナルを送る必要があるらしい。
(Widgetを共有して直接UIを変更しても反映されない)

import sys,time
from PySide2 import QtCore,QtWidgets

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

        self.label = QtWidgets.QLabel(self)
        self.thread = TestProcess(self)
        self.thread.signal.connect(self.setText)
        self.thread.start()

    def setText(self,n):
        self.label.setText('繰り返し回数 n='+str(n))

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

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

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

if __name__ == '__main__':
    main()

複数の情報を返したい時はlistかtupleを使う


hanging GUI directly from Qthread PyQt 5
https://stackoverflow.com/questions/45665787/changing-gui-directly-from-qthread-pyqt-5