Сбой ImageItem после минуты отображения кадров с камеры

У меня есть виджет PyQtGraph, который я использую для отображения обработанных массивов из фреймграббера. Поток получает их, помещает эти данные в очередь, а другой поток получает эти данные из очереди и вызывает обновление (данные) в моем виджете. Данные представляют собой относительно небольшой (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. Остальной графический интерфейс работает нормально для последующего использования, но приведенный выше виджет не отвечает.


person Stephen    schedule 15.07.2019    source источник


Ответы (1)


Трудно сказать, потому что я не могу воспроизвести вашу проблему, но я могу назвать несколько возможных причин.

  1. Возможно, базовый буфер данных массива data совместно используется потоками и неправильно обновляется. Попробуйте сделать копию массива, прежде чем устанавливать его в образ с помощью self.image.setImage(np.copy(data),...
  2. GraphicsLayoutWidget является потомком QWidget и поэтому имеет метод update. Вы переопределяете его другой подписью. Я не знаю, что PyQt точно справляется с этим, но попробуйте переименовать свой метод в updateImage и посмотрите, будет ли это иметь значение.
  3. Почему вы используете processEvents? Здесь он вам не нужен.

Ваш пример кода не является MVCE в том смысле, что он не завершен; отсутствует информация о том, как данные создаются в другом потоке. Стопроцентная полнота не всегда достижима (внешние библиотеки и тому подобное), но постарайтесь сделать ее максимально полной. Создание полного, минимального и проверяемого примера может потребовать значительных усилий, но чем больше усилий вы приложите, тем больше ответов вы получите и тем лучше они будут.

person titusjan    schedule 17.07.2019
comment
Проблема заключалась в перезаписи метода update. Спасибо за ваш отзыв - person Stephen; 17.07.2019
comment
Пожалуйста :-). Отметьте вопрос как ответ, поставив зеленую галочку. - person titusjan; 17.07.2019