PyQt5多线程仍然冻结。如何提高绩效?

2024-10-03 00:24:45 发布

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

我正试图为我所写的一些图像处理算法编写一个PyQt应用程序。问题是,这需要一些时间,并使应用程序冻结(直到它完成,但用户可能被迫关闭应用程序在同一时间)

我试图理解如何实现多线程,但我似乎不能使它工作。这个例子只是在不同的线程上加载了一个大的图像,但它仍然使整个应用程序冻结。我肯定我在哪里犯了个错误

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class App(QWidget):
    def __init__(self):
       super().__init__()
       self._unit_ui()

    def _unit_ui(self):
        label = QLabel(self)
        label.resize(700, 700)

        button = QPushButton(self)

        self.th = Thread(self)
        self.th.change_pixmap.connect(label.setPixmap)
        button.pressed.connect(self.th.start)

        self.show()


class Thread(QThread):
    change_pixmap = pyqtSignal(QPixmap)

    def __init__(self, parent=None):
        QThread.__init__(self, parent=parent)
        self.isRunning = True

    def run(self):
        pixmap = QPixmap('gridscan.jpg')
        self.change_pixmap.emit(pixmap)



app = QApplication(sys.argv)
m = App()
sys.exit(app.exec_())

Tags: fromimportselfapp应用程序initdefsys
2条回答

在埃伦的帮助下,我设法解决了这个问题。 我刚刚停止在第二个线程中使用QPixmap,用另一个函数导入图像,并将其传递(将pyqtSignal(QPixmap)更改为pyqtSignal(np.ndarray)),现在它可以完美地工作了! 谢谢

你可以试试看这个答案: https://stackoverflow.com/a/38003561/9066493

基本上,self.th需要移动到不同的线程,如:

# Setup the worker object and the worker_thread.
self.worker = WorkerObject()
self.worker_thread = QtCore.QThread()
self.worker.moveToThread(self.worker_thread)
self.worker_thread.start()

然后使用signal和slot在主线程和工作线程之间传输数据,您需要将其connect转换为特定的方法slot

希望这个例子有帮助

相关问题 更多 >