pyqtgraph grabFrameBuffer сохраняет пустое изображение

#python #pyqtgraph

#python #pyqtgraph

Вопрос:

У меня есть 3D-рендеринг, который выглядит как изображение ниже, которое я пытаюсь сохранить. Однако изображение получается черным, и ничего не нарисовано, и я не уверен, почему. Я следую руководству здесь https://pyqtgraph.readthedocs.io/en/latest/exporting.html#exporting-3d-graphics что не дает большой помощи. Он просто записывает glview.grabFrameBuffer().save('fileName.png')

введите описание изображения здесь

Вот важные части кода. Я заменил раздел, отображающий линии и облака точек, на однострочный рендеринг.

 import pyqtgraph.opengl as gl

from pyqtgraph.Qt import QtWidgets

if __name__ == '__main__':
    
    # initialize screen
    app = QtWidgets.QApplication(sys.argv)
    w = gl.GLViewWidget()
    
    line = np.array([[0,0,0],[1,1,1]])
    line_renderer = gl.GLLinePlotItem(pos=line, width=1, antialias=False)
    w.addItem(line_renderer)
    
    g = gl.GLGridItem()
    w.addItem(g)
    w.show()
    w.grabFrameBuffer().save('fileName.png')
    app.exec()
 

Ответ №1:

grabFrameBuffer() создает QImage на основе того, что показано в GLViewWidget , но рендеринг инструкций не происходит мгновенно, но вы должны дождаться, пока Qt это сделает. Учитывая вышесказанное, решение состоит в том, чтобы использовать QTimer для выполнения этой задачи мгновением позже:

 QtCore.QTimer.singleShot(100, lambda: w.grabFrameBuffer().save("fileName.png"))
 

Комментарии:

1. Спасибо! Мне пришлось увеличить время, чтобы отобразить мою сцену с линиями и облаками точек, поскольку я все еще получал пустое изображение с 100 мс. Есть ли способ автоматически определить длину или принудительно сохранить qt только после завершения рендеринга? Или я должен методом проб и ошибок использовать несколько значений?

2. @Kong В общем, оно должно быть выше времени обновления, которое обычно составляет 30 мс, поэтому установите 100 мс для изображения. С другой стороны, я думаю, что в его реальном применении требуется больше времени по другим причинам, которые я не знаю, поскольку вы не предоставляете MRE этого кода, поэтому я не буду указывать на что-либо еще для него: он не может указывать что-либо о коде, которого я не знаю