python - 如何从另一个线程向 gui 发送标签 - PyQt

标签 python multithreading python-3.x pyqt5 signals-slots

这是一个简单的漫画阅读器,我试图在不卡住主窗口的情况下加载图像,我尝试使用线程来执行此操作但无法将图像发送到主窗口,我做错了什么?如果有另一种方法我想知道谢谢,我也是 python 的新手。

from PyQt5 import QtCore, QtGui, QtWidgets
import os

class MainWin(QtWidgets.QMainWindow):

    ...

    def add_widget(self, data):
        self.verticalLayout.addWidget(data)

    def file_open(self):
        adres = QtWidgets.QFileDialog.getExistingDirectory()
        self.loader = LoaderThread(adres)
        self.loader.start()
        self.loader.pics.connect(self.add_widget)


class LoaderThread(QtCore.QThread):

    pics = QtCore.pyqtSignal(object)

    def __init__(self, nAdres):
        QtCore.QThread.__init__(self)
        self.adres = nAdres

    def run(self):
        liste = os.listdir(self.adres)
        order = 0
        for i in liste:
            label = QtWidgets.QLabel()
            pixmap = QtGui.QPixmap(self.adres + '/' + liste[order])
            label.setPixmap(pixmap)
            self.pics.emit(label)
            order += 1

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    win = MainWin()
    win.show()
    sys.exit(app.exec_())

最佳答案

您不能在 GUI 线程之外创建小部件或像素图。所以只需在工作线程中创建一个QImage,然后在槽中创建标签和像素图:

class LoaderThread(QtCore.QThread):
    ...
    def run(self):
        liste = os.listdir(self.adres)
        order = 0
        for i in liste:
            image = QtGui.QImage(self.adres + '/' + liste[order])
            self.pics.emit(image)
            order += 1


class MainWin(QtWidgets.QMainWindow):
    ...
    def add_widget(self, image):
        label = QtWidgets.QLabel()
        label.setPixmap(QtGui.QPixmap.fromImage(image))
        self.verticalLayout.addWidget(label)

关于python - 如何从另一个线程向 gui 发送标签 - PyQt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41733518/

相关文章:

delphi - 如何在超时的单独线程中发出 HTTP 请求?

c - 在没有锁的情况下将循环缓冲区与写入和读取操作同步

python - 更新 kivy 上的标签

Python Pandas 在相同 len() 的两列中使用不同的 value_counts()

python - 应用程序和媒体服务器之间的文件传输

Python:将元组列表转换为对象列表?

python - tensorflow2.1 InvalidArgumentError : assertion failed: [0] [Op:Assert] name: EagerVariableNameReuse

multithreading - 负载下降后线程会缠绕

python - 适用于 3dsMax 和 Modo 的 PySide 小部件

python - 为什么这个 argparse 代码在 Python 2 和 3 之间表现不同?