Метод захвата QWidget не работает с объектом QVTKRenderWindowInteractor - PullRequest
1 голос
/ 04 июля 2019

Используя 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()

Ожидаемый результат - это, конечно, фактическое окно, когда человек нажимает кнопку «Печать».

...