Python 正在尝试将映像从QThread发送到PyQt中的主线程或其他线程

Python 正在尝试将映像从QThread发送到PyQt中的主线程或其他线程,python,multithreading,image,pyqt,signals,Python,Multithreading,Image,Pyqt,Signals,我试图在主线程中显示另一个线程的图像,甚至可能是一个新线程。问题是我无法将图像显示在其他任何地方。我正在使用thread\u thread下载图像,这样它就不会冻结gui,但我似乎无法使用QImage或QPixmap正确地将其取出。 我知道如何在信号中使用字符串等,如下面的示例所示,但我不确定如何正确发送信号中的图像。我曾尝试使用请求获取图像url并将其发送到main,但我无法获取main中的字符串,然后快速下载到那里。这也是一个不好的选择,因为会暂时冻结GUI 这段代码是一个例子,它表明我可以

我试图在主线程中显示另一个线程的图像,甚至可能是一个新线程。问题是我无法将图像显示在其他任何地方。我正在使用thread
\u thread
下载图像,这样它就不会冻结gui,但我似乎无法使用QImage或QPixmap正确地将其取出。
我知道如何在信号中使用字符串等,如下面的示例所示,但我不确定如何正确发送信号中的图像。我曾尝试使用请求获取图像url并将其发送到main,但我无法获取main中的字符串,然后快速下载到那里。这也是一个不好的选择,因为会暂时冻结GUI

这段代码是一个例子,它表明我可以完成所有的工作,如果我愿意的话,可以下载主要的图像,但是我不愿意

import urllib2
from PyQt4 import QtGui
from PyQt4.QtCore import QThread, pyqtSignal
from PyQt4.QtGui import QApplication, QPixmap
import sys

class MainWindow(QtGui.QWidget):
    def __init__(self):
        super(self.__class__, self).__init__()
        layout = QtGui.QVBoxLayout(self)
        self._Button = QtGui.QPushButton()
        self._Button.setObjectName("_Button")
        self.line_edit = QtGui.QLineEdit()
        self.line_edit.setObjectName("line_edit")
        self.txt_box = QtGui.QTextEdit()
        self.txt_box.setObjectName("txt_Box")
        self.img_label = QtGui.QLabel()
        self.img_label.setObjectName("img_label")
        layout.addWidget(self._Button)
        layout.addWidget(self.line_edit)
        layout.addWidget(self.img_label)
        layout.addWidget(self.txt_box)

        self.pixmap = QPixmap()
        self._thread = test_thread()
        self._Button.clicked.connect(self.start_thread)
        self.get_Text = self._thread.test_Signal.connect(self.line_edit.setText)

        self.urls = 'https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_120x44dp.png'
        data = urllib2.urlopen(self.urls).read()
        self.pixmap.loadFromData(data)
        self.img_label.setPixmap(self.pixmap)

    def start_thread(self):
        self._thread.start()
        self._thread.test_Signal.connect(self.txt_box.setText)


class test_thread(QThread):
    test_Signal = pyqtSignal(str)
    def __init__(self):
        super(test_thread, self).__init__()

    def run(self):
        string = 'This is a test string.'
        self.test_Signal.emit(string)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec_())
这段代码显示了我想做的更多事情

import urllib2
from PyQt4 import QtGui
from PyQt4.QtCore import QThread, pyqtSignal
from PyQt4.QtGui import QApplication, QPixmap
import sys

class MainWindow(QtGui.QWidget):
    def __init__(self):
        super(self.__class__, self).__init__()
        layout = QtGui.QVBoxLayout(self)
        self._Button = QtGui.QPushButton()
        self._Button.setObjectName("_Button")
        self.line_edit = QtGui.QLineEdit()
        self.line_edit.setObjectName("line_edit")
        self.txt_box = QtGui.QTextEdit()
        self.txt_box.setObjectName("txt_Box")
        self.img_label = QtGui.QLabel()
        self.img_label.setObjectName("img_label")
        layout.addWidget(self._Button)
        layout.addWidget(self.line_edit)
        layout.addWidget(self.img_label)
        layout.addWidget(self.txt_box)

        self.pixmap = QPixmap()
        self._thread = test_thread()
        self._Button.clicked.connect(self.start_thread)
        self.get_Text = self._thread.test_Signal.connect(self.line_edit.setText)

    "...Send signal here and show image. EX:"
    "...self._thread.image_Signal.connect(self.img_label.setPixmap)...."
    "...or...."
    def show_image_here(self):
        "....Send image here after downloaded in thread...."

    def start_thread(self):
        self._thread.start()
        self._thread.test_Signal.connect(self.txt_box.setText)

class test_thread(QThread):
    test_Signal = pyqtSignal(str)

    "....Example image signal...."
    "....image_Signal = pyqtSignal()...."

    def __init__(self):
        super(test_thread, self).__init__()
        self.pixmap = QPixmap()

    def run(self):
        string = 'This is a test string.'
        self.test_Signal.emit(string)

        self.urls = 'https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_120x44dp.png'
        data = urllib2.urlopen(self.urls).read()
        self.pixmap.loadFromData(data)
        "....Not sure what to do here...."

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec_())

有人能帮我吗?谢谢。

我又四处看了看,发现了这条线

我希望我能早点找到它,因为我在发帖子之前做了很多搜索。回答该线程的人也在评论中发布了此消息:

这极大地帮助我更好地理解了一些事情。我使用了他的代码,并对其进行了轻微修改,使其适合我的代码,这将非常适合我想要做的事情。
下面是我的完整工作代码,使用我的原始示例,供任何可能觉得有用的人使用

import urllib2
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import QThread, pyqtSignal
from PyQt4.QtGui import QApplication
import sys

class MainWindow(QtGui.QWidget):
    def __init__(self):
        super(self.__class__, self).__init__()
        layout = QtGui.QVBoxLayout(self)
        self._Button = QtGui.QPushButton()
        self._Button.setObjectName("_Button")
        self.line_edit = QtGui.QLineEdit()
        self.line_edit.setObjectName("line_edit")
        self.txt_box = QtGui.QTextEdit()
        self.txt_box.setObjectName("txt_Box")
        self.img_label = QtGui.QLabel()
        self.img_label.setObjectName("img_label")
        self.imagepreview = ImagePreview()
        layout.addWidget(self._Button)
        layout.addWidget(self.line_edit)
        layout.addWidget(self.img_label)
        layout.addWidget(self.txt_box)
        layout.addWidget(self.imagepreview)

        self._thread = test_thread()
        self._Button.clicked.connect(self.start_thread)
        self._Button.clicked.connect(self.imagepreview.startDownload)
        self.get_Text = self._thread.test_Signal.connect(self.line_edit.setText)

    def start_thread(self):
        self._thread.start()
        self._thread.test_Signal.connect(self.txt_box.setText)


class test_thread(QThread):
    test_Signal = pyqtSignal(str)

    def __init__(self):
        super(test_thread, self).__init__()

    def run(self):
        string = 'This is a test string.'
        self.test_Signal.emit(string)


class DownloadThread(QtCore.QThread):
    data_downloaded = pyqtSignal()

    def __init__(self, url):
        QtCore.QThread.__init__(self)
        self.url = url
        self._data = None

    def run(self):
        self._data = urllib2.urlopen(self.url).read()
        self.data_downloaded.emit()

    def get_data(self):
        return self._data


class ImagePreview(QtGui.QWidget):
    def __init__(self, parent=None):
        super(ImagePreview, self).__init__(parent)
        self.setMinimumSize(50, 50)
        self.pixmap = None

    def paintEvent(self, paintEvent):
        painter = QtGui.QPainter(self)
        if (self.pixmap):
            painter.drawPixmap(0, 0, self.pixmap)

    def startDownload(self):
        self.download_thread = DownloadThread('https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_120x44dp.png')
        self.download_thread.start()
        self.download_thread.data_downloaded.connect(self.ondownloadFinished)

    def ondownloadFinished(self):
        self.paintImage()
        print("download finished")

    def paintImage(self):
        print("Painting")
        pixmap = QtGui.QPixmap()
        pixmap.loadFromData(self.download_thread.get_data())
        self.setPixmap(pixmap)

    def setPixmap(self, pixmap):
        self.pixmap = pixmap
        self.setMinimumSize(pixmap.width(), pixmap.height())
        self.update()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec_())

仅供参考,您可以从
QtNetwork
使用
QNetworkAccessManager
QNetworkRequest
而不是
urlib2
。你可以得到一个例子是的,我看到了,但我还没有机会真正研究它,所以现在我只使用urllib2,但我肯定会研究它。谢谢你的建议和链接。