Используя pyqt (Python3.7, в Ubuntu 18.04), я создал графический интерфейс, в котором я рендерил некоторые элементы VTK, из которых я хочу создать видео. Поэтому мне нужно Qwidget.grab () в главном окне и сохранить его в файл png (чтобы я мог собрать изображения в видеофайл).
Это прекрасно работает для всего окна (включая QWidget, такие как ползунки, выпадающий список и т. Д. И изображения matplotlib), за исключением визуализированного объекта VTK (QVTKRenderWindowInteractor), поскольку он заменяет его на рисунке в черный ящик или иногда белый шум.
Я сделал минимальный пример проблемы, надеясь, что основной проблемой была сложность всей программы. К сожалению, даже для минимального кода он все равно не отображает часть окна VTK.
Вот минимальный пример моей проблемы, когда нажатие на кнопку «Печать» должно захватить изображение и сохранить его в файл PNG.
import sys
from PyQt5.QtWidgets import QVBoxLayout,QPushButton, QWidget, QApplication
import vtk
from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
def print_screen_callback(w):
w.grab().save("non_satisfying_printed_window.png")
# Create a small interface that show a cylinder and allow to print it to a PNG file
app = QApplication(sys.argv)
w = QWidget()
w.show()
lay = QVBoxLayout()
w.setLayout(lay)
# Create and populate the vtk widget
ren = vtk.vtkRenderer()
w_vtk = QVTKRenderWindowInteractor()
lay.addWidget(w_vtk)
w_vtk.Initialize()
w_vtk.Start()
w_vtk.GetRenderWindow().AddRenderer(ren)
cylinder = vtk.vtkCylinderSource()
cylinder.SetResolution(8)
cylinderMapper = vtk.vtkPolyDataMapper()
cylinderMapper.SetInputConnection(cylinder.GetOutputPort())
cylinderActor = vtk.vtkActor()
cylinderActor.SetMapper(cylinderMapper)
ren.AddActor(cylinderActor)
# Add print screen button
but = QPushButton("Print")
lay.addWidget(but)
but.released.connect(lambda: print_screen_callback(w))
# Run the application
app.exec()
Ожидаемый результат - это, конечно, фактическое окно, когда человек нажимает кнопку «Печать».