python - vtkBoxWidget 不适用于 PyQt5 应用程序
问题描述
我正在尝试使用QVTKRenderWindowInteractor在 PyQt5 中嵌入 vtk 渲染代码。当我尝试在其中使用 vtkBoxWidget 时,程序崩溃了。如果没有 vtkBoxWidget(包含在下面的代码中的两行内),它可以正常工作。你能帮我找到问题吗?我正在尝试在 vtkBoxWidget 的帮助下使用边界框手动裁剪渲染的对象。
代码:
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QFrame, QVBoxLayout
import sys
import vtk
from PyQt5 import QtGui
from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
class MainWindow(QMainWindow):
def __init__(self, parent=None):
QMainWindow.__init__(self, parent)
self.frame = QFrame()
self.vl = QVBoxLayout()
self.vtkWidget = QVTKRenderWindowInteractor(self.frame)
self.vl.addWidget(self.vtkWidget)
self.ren = vtk.vtkRenderer()
self.vtkWidget.GetRenderWindow().AddRenderer(self.ren)
self.iren = self.vtkWidget.GetRenderWindow().GetInteractor()
self.iren.SetInteractorStyle(vtk.vtkInteractorStyleTrackballCamera())
# Create source
source = vtk.vtkSphereSource()
source.SetCenter(0, 0, 0)
source.SetRadius(5.0)
# Create a mapper
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(source.GetOutputPort())
# Create an actor
actor = vtk.vtkActor()
actor.SetMapper(mapper)
###################################################################################
boxWidget = vtk.vtkBoxWidget()
boxWidget.SetInteractor(self.iren)
boxWidget.SetPlaceFactor(1.0)
boxWidget.SetRotationEnabled(0)
planes = vtk.vtkPlanes()
def ClipVolumeRender(obj, event):
obj.GetPlanes(planes)
mapper.SetClippingPlanes(planes)
boxWidget.SetProp3D(actor)
boxWidget.PlaceWidget()
boxWidget.InsideOutOn()
boxWidget.AddObserver("InteractionEvent", ClipVolumeRender)
boxWidget.On()
###################################################################################
self.ren.AddActor(actor)
self.ren.ResetCamera()
self.frame.setLayout(self.vl)
self.setCentralWidget(self.frame)
self.show()
self.iren.Initialize()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec_())
解决方案
问题是 boxWidget 是一个被python消除的局部变量,所以之后应用程序尝试访问该对象,但它不再分配内存,从而产生Segmentation fault。解决方案是通过更改来扩展boxWidget
范围self.boxWidget
。
推荐阅读
- error-handling - 如何将错误消息从 os.system 重定向到某个文件?
- java - 为什么找不到班级?JUnit Runner 错误
- ios - UITextField leftView 和 rightView 重叠问题 - iOS13
- java - 如何在 Java 中获取 Youtube 视频结果?
- vb.net - 枚举属性中的变量:需要常量表达式
- python-3.x - 列表元素的总和等于所需的数量(总和)
- python - Python中的字段替换
- jquery - 将悬停功能更改为在移动设备上单击/触摸
- c# - 如何遍历对象并检查其中一些是孩子还是父母?
- javascript - 我可以使用 express.js 创建 web api 并且没有安装 node.js 吗?