我有一个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的其余部分可以很好地用于以后的使用,但是上面的小部件没有响应。
答案 0 :(得分:0)
很难说,因为我无法重现您的问题,但我可以想到一些潜在原因。
data
数组的基础数据缓冲区在线程之间共享并且被错误地更新。使用self.image.setImage(np.copy(data),...
GraphicsLayoutWidget
是QWidget
的后裔,因此具有update
方法。您可以使用其他签名覆盖它。我不知道PyQt可以准确地处理此问题,但是请尝试将您的方法重命名为updateImage
,看看它是否有所不同。processEvents
?您这里不需要它。您的代码示例不是MVCE,因为它不完整;缺少有关如何在另一个线程中创建数据的信息。并非总是可以实现百分百的完整性(外部库等),但是请尝试使其尽可能完整。要制作一个完整的,最小的和可验证示例可能需要大量工作,但是您投入的精力越多,您得到的答案就会越多,而且效果也会越好。