最低工作实例:
from sys import exit
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QHBoxLayout, QLabel, QFrame
from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
import vtkmodules.all as vtk
from vtkmodules.util import numpy_support
import numpy as np
vtk_out = vtk.vtkOutputWindow()
vtk_out.SetDisplayMode(0)
def generate_qtvtk_sphere(parent):
frame = QFrame(parent)
vtkWidget = QVTKRenderWindowInteractor(frame)
ren = vtk.vtkRenderer()
vtkWidget.GetRenderWindow().AddRenderer(ren)
iren = vtkWidget.GetRenderWindow().GetInteractor()
# 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)
ren.AddActor(actor)
ren.ResetCamera()
iren.Initialize()
iren.Start()
return vtkWidget
def generate_qtvtk_imagedata(parent):
frame = QFrame(parent)
vtkWidget = QVTKRenderWindowInteractor(frame)
random_array = np.random.random([10, 600, 800])
vtk_image_data = vtk.vtkImageData()
image_array = numpy_support.numpy_to_vtk(random_array.ravel(), deep=True, array_type=vtk.VTK_TYPE_UINT16)
vtk_image_data.GetPointData().SetScalars(image_array)
vtk_image_data.Modified()
reslice = vtk.vtkImageReslice()
reslice.SetInputData(vtk_image_data)
reslice.SetOutputDimensionality(2)
ren = vtk.vtkRenderer()
vtkWidget.GetRenderWindow().AddRenderer(ren)
iren = vtkWidget.GetRenderWindow().GetInteractor()
# Create an actor
actor = vtk.vtkImageActor()
actor.GetMapper().SetInputConnection(reslice.GetOutputPort())
ren.SetBackground(50, 50, 50)
ren.AddActor(actor)
ren.ResetCamera()
interactorStyle = vtk.vtkInteractorStyleImage()
vtkWidget.SetInteractorStyle(interactorStyle)
vtkWidget.GetRenderWindow().SetInteractor(vtkWidget)
vtkWidget.GetRenderWindow().Render()
iren.Initialize()
iren.Start()
return vtkWidget
app = QApplication([])
main_window = QMainWindow()
main_widget = QWidget()
main_layout = QHBoxLayout()
main_widget.setLayout(main_layout)
qtvtk_widget_sphere = generate_qtvtk_sphere(main_widget)
qtvtk_widget_image = generate_qtvtk_imagedata(main_widget)
main_layout.addWidget(qtvtk_widget_image)
main_layout.addWidget(qtvtk_widget_sphere)
main_window.setCentralWidget(main_widget)
main_window.show()
app.exec()
这段代码的输出应该是一个pyqt窗口,一边是球体,另一边是随机生成的黑方块。这个方块代表了我通常处理的数据集。
我的conda env中的相关软件包是:
我得到的全部错误如下:
原文如下:
在我的应用程序中,我有两个QVTKRenderWindowInteractor
,在两个不同的QWidgets上,它们基本上是相互独立的--在交互器之外有一个函数可以在同一件事情上更新两个交互参与者的内容,但仅此而已。
每当应用程序同时显示两个交互参与者时,当应用程序关闭时,我都会得到以下错误:
2022-08-23 13:51:07.522 ( 10.079s) [ ]vtkWin32OpenGLRenderWin:267 ERR| vtkWin32OpenGLRenderWindow (00000194B174E4C0): wglMakeCurrent failed in MakeCurrent(), error: ࣐Ɣ
在调试器上,最终的错误部分如下所示
通常会出现很多这样的错误。
我的另一个应用程序(相同的想法、qt、相同的交互程序、相同的设置)在代码的开头有这些行。
vtk_out = vtkOutputWindow()
vtk_out.SetDisplayMode(0)
这就消除了那个错误。
但是在我的另一个程序中,我需要使用一个QWorker/QThread来更新interactor,并且将错误输出到控制台上已经不起作用了(它用相同的错误创建了一个新窗口,然后冻结了一切)。
我只想知道这些错误到底是什么,以及如何消除它们。
另外,我正在使用的设置interactor的代码如下所示:
在小部件中:
self._frame = QGroupBox()
self.interactor = ViewerPanelVTK(self._frame)
layout = QVBoxLayout(self)
layout.addWidget(self.interactor)
哪里
class ViewerPanelVTK(QVTKRenderWindowInteractor):
def __init__(self, parent=None):
super().__init__(parent)
self.panel_actor = vtkImageActor()
self.panel_renderer = vtkRenderer()
self.window = self.GetRenderWindow()
发布于 2022-08-31 10:49:47
显然,小部件需要关闭,这样就不会显示此错误。
原始答案中的示例代码如下:
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
import vtk
class vtkWin(QWidget):
def __init__(self):
super().__init__()
layout = QVBoxLayout()
self.setLayout(layout)
self.vtkWidget = QVTKRenderWindowInteractor()
layout.addWidget(self.vtkWidget)
render = vtk.vtkRenderer()
self.vtkWidget.GetRenderWindow().AddRenderer(render)
cone_a=vtk.vtkConeSource()
coneMapper = vtk.vtkPolyDataMapper()
coneMapper.SetInputConnection(cone_a.GetOutputPort())
coneActor = vtk.vtkActor()
coneActor.SetMapper(coneMapper)
render.AddActor(coneActor)
self.vtkWidget.GetRenderWindow().Render()
def closeEvent(self, QCloseEvent):
super().closeEvent(QCloseEvent)
self.vtkWidget.Finalize() ############################ important
class MainWindow(QWidget):
def __init__(self):
super().__init__()
layout = QHBoxLayout()
self.setLayout(layout)
self.w1 = vtkWin()
self.w2 = vtkWin()
layout.addWidget(self.w1)
layout.addWidget(self.w2)
def closeEvent(self, QCloseEvent):
super().closeEvent(QCloseEvent)
self.w1.close()
self.w2.close()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWindow()
w.show()
app.exec_()
https://stackoverflow.com/questions/73457615
复制相似问题