在执行cpu密集型任务时,如何使PyQtGUI保持响应?

2024-10-01 04:52:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个数据采集程序,我有兴趣保持图形用户界面随时响应。这就是为什么我要用QThreads来做这个工作。尽管与整个任务在单个线程中完成的情况相比,结果稍微好一些,但是我的GUI仍然挂起,直到任务完成。这是准则的相关部分:

import numpy as np
from PyQt4 import QtGui, QtCore
import h5py as hdf
import tifffile as tiff


class MyWidget(QtGui.QFrame):

    def __init__(self, *args, **kwargs):

        super(MyWidget, self).__init__(*args, **kwargs)
        self.convertButton = QtGui.QPushButton('Convert to TIFF')
        self.convertButton.clicked.connect(self.convertToTiff)
        recGrid = QtGui.QGridLayout()
        self.setLayout(recGrid)
        recGrid.addWidget(self.convertButton, 0, 0)

    def convertToTiff(self):
        self.converterThread = QtCore.QThread()
        self.converter = TiffConverter(self.savename, self.dataname)
        self.converter.moveToThread(self.converterThread)
        self.converterThread.started.connect(self.converter.run)
        self.converterThread.start()


class TiffConverter(QtCore.QObject):

    def __init__(self, filename, dataname, *args, **kwargs):
        super(TiffConverter, self).__init__(*args, **kwargs)
        self.filename = filename
        self.dataname = dataname
        self.file = hdf.File(self.filename, mode='r')

    def run(self):
        tiff.imsave(self.filename, self.file[self.dataname])
        self.file.close()


if __name__ == '__main__':
    app = QtGui.QApplication([])

    win = MyWidget()
    win.show()

    app.exec_()

我知道GUI挂在tiff.imsave(self.filename, self.file[self.dataname])上,而且我很熟悉qthread并不是真正的并行计算。这是GUI挂起的原因吗?或者像我这样分享变量有问题吗?这类案件有什么变通办法吗?在


Tags: importselfinitdefasargsguifilename