一分钟显示相机中的帧后,ImageItem崩溃

时间:2019-07-15 15:06:13

标签: python pyqtgraph

我有一个PyQtGraph小部件,用于显示来自framegrabber的已处理数组。一个线程获取这些将这些数据放入队列,另一个线程从该队列获取这些数据并在我的小部件上调用update(data)。数据是一个相对较小的(400 * 100)numpy数组

class BScanView(PyQtG.GraphicsLayoutWidget):

    def __init__(self, aspect=0.5):
        super().__init__()
        self.aspect = aspect

        self.viewbox = self.addViewBox(row=1,col=1)
        self.viewbox.setAspectLocked()
        self.image = PyQtG.ImageItem()
        self.viewbox.addItem(self.image)

    def update(self, data):
        self.image.clear()
        self.image.setImage(data, autoLevels=False, levels=(-100, -2))
        QtGui.QGuiApplication.processEvents()

这可以工作一段时间,但会随机使ImageItem崩溃。 GUI的其余部分可以很好地用于以后的使用,但是上面的小部件没有响应。

1 个答案:

答案 0 :(得分:0)

很难说,因为我无法重现您的问题,但我可以想到一些潜在原因。

  1. 也许data数组的基础数据缓冲区在线程之间共享并且被错误地更新。使用self.image.setImage(np.copy(data),...
  2. 在图像中设置数组之前,请尝试制作该数组的副本
  3. GraphicsLayoutWidgetQWidget的后裔,因此具有update方法。您可以使用其他签名覆盖它。我不知道PyQt可以准确地处理此问题,但是请尝试将您的方法重命名为updateImage,看看它是否有所不同。
  4. 您为什么使用processEvents?您这里不需要它。

您的代码示例不是MVCE,因为它不完整;缺少有关如何在另一个线程中创建数据的信息。并非总是可以实现百分百的完整性(外部库等),但是请尝试使其尽可能完整。要制作一个完整的,最小的可验证示例可能需要大量工作,但是您投入的精力越多,您得到的答案就会越多,而且效果也会越好。