#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 этого кода, поэтому я не буду указывать на что-либо еще для него: он не может указывать что-либо о коде, которого я не знаю