QWidget的grab方法在qvtkrenderWindowInteractior对象上不起作用

2024-10-01 17:34:03 发布

您现在位置:Python中文网/ 问答频道 /正文

使用pyqt(Python3.7,在ubuntu18.04上),我创建了一个GUI,在其中我呈现了一些我想要创建视频的VTK内容。因此,我需要Qwidget.grab()主窗口并将其保存到png文件中(这样我就可以将图像组装到视频文件中)。 除了渲染的VTK对象(qvtkrenderwindowinteractior)之外,它可以很好地处理窗口上的所有对象(包括QWidgets,如滑块、组合框等和matplotlib图像),因为它将图片中的对象替换为黑框或有时是白噪声

我只举了一个很小的例子,希望整个程序的复杂性是主要的问题。不幸的是,即使代码很少,它仍然不能呈现窗口的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()

当用户按下“打印”按钮时,预期的输出当然是实际的窗口


Tags: 对象图像importscreenbutprintgrabvtk

热门问题