python - 线程 : It is not safe to use pixmaps outside the GUI thread

标签 python multithreading qt pyqt qpixmap

我正在构建一个音乐播放器,它使用 SqueezePlay 检查状态,它是一个 SqueezeBox Controller 应用程序。长话短说,我使用线程每 5 秒检查一次 Squeezeplay 的状态。如果歌曲标题发生变化,我让它更新标签(Qlabel、专辑插图(QPixmap)等。但是,当我要求它通过线程更新它时,我得到 在外面使用像素图是不安全的GUI 线程 .

如何在进行线程处理的同时设置 QPixmap?

示例代码:

#self.sq.getArtwork() returns variable with the image
coverArt = self.sq.getArtwork()
coverPixMap = QtGui.QPixmap()
coverPixMap.loadFromData(coverArt)
self.albumArt.setPixmap(coverPixMap)

非常感谢!

更新: 我用 Emit 尝试了以下操作,但它不起作用,有人可以看看我做错了什么吗?

def setNewArtwork(self, image):
    coverPixMap = QtGui.QPixmap()
    coverPixMap.convertFromImage(image)
    icon = QtGui.QIcon(coverPixMap)
    item.setIcon(icon)

def getNewArtwork(self):
    coverArt = self.sq.getArtwork()
    icon = QtGui.QImage(coverArt)
    self.emit(QtCore.SIGNAL('setNewArtwork(QImage)'), icon)

最佳答案

所有图形化 Qt 操作都应该在主线程中进行。其他线程实际上不允许调用 Qt 图形操作(可能包括像素图)。

他们可以 emit Qt signals到主线程。或者简单地(在 Linux 上)写入一个管道,并且有主 thread等待该管道上的输入。

当然,您必须定义所需的信号(以及插槽)。在 C++ 代码中,您需要用 signals:(或 slots:)标记它们,并且您的 C++ 代码应该由 moc 处理。 .我不知道什么是 Python 对应物(也许 python 反射能力可能就足够了,我真的不知道)。然后,您必须使用 排队 连接将信号连接到插槽。我不知道如何在 Python 中做到这一点。

关于python - 线程 : It is not safe to use pixmaps outside the GUI thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8649233/

相关文章:

c++ - 捕获在不同线程中运行的方法的异常的正确方法是什么?

c++ - 保持活跃的线程 (Qt)

c++ - gcc7 中的枚举和三元奇怪行为

python - 在 Twisted 中发起 HTTPS 请求

android - 处理 Activity 和 Thread 之间关系的常见做法是什么

python - 了解如何在 pygame 中更新屏幕?

java - executorService多线程池的性能

python - 在 Pyside 中为 QComboBox 创建自定义项目

python - 加速比较句子的比较功能

python - 球坐标中的蒙特卡罗积分