Integrating VTK with PyQT

Hi. I am using vtk in my pyQt project.
The issue I’m encountering is puzzling because the error doesn’t occur every time. Do you have any ideas on what might be causing this and how to diagnose it?

Here is the relevant code snippet of the creation of my viewer:

class myViewer(QVTKRenderWindowInteractor):
        def __init__(self, parent=None):
        super().__init__(parent) 
        self.Init_view()


    def Init_view(self):
        self.Initialize()
        self.Start()
        self.renderer = vtkRenderer()
        self.GetRenderWindow().AddRenderer(self.renderer)

        self.interactor = self.GetRenderWindow().GetInteractor()
        self.interactor.SetInteractorStyle(self.style_2d) 
                 
        self.renderer.ResetCamera()
        self.show()

The following is the results in the terminal:

  File "C:\Users\.conda\envs\vtkenv\lib\site-packages\vtkmodules\qt\QVTKRenderWindowInteractor.py", line 473, in 
resizeEvent
    self._Iren.SetSize(w, h)
  File "C:\Users\.conda\envs\vtkenv\lib\site-packages\vtkmodules\qt\QVTKRenderWindowInteractor.py", line 416, in 
__getattr__
    elif hasattr(self._Iren, attr):
  File "C:\Users\.conda\envs\vtkenv\lib\site-packages\vtkmodules\qt\QVTKRenderWindowInteractor.py", line 416, in 
__getattr__
    elif hasattr(self._Iren, attr):
  File "C:\Users\.conda\envs\vtkenv\lib\site-packages\vtkmodules\qt\QVTKRenderWindowInteractor.py", line 416, in 
__getattr__
    elif hasattr(self._Iren, attr):
  [Previous line repeated 987 more times]
  File "C:\Users\.conda\envs\vtkenv\lib\site-packages\vtkmodules\qt\QVTKRenderWindowInteractor.py", line 414, in 
__getattr__
    if attr == '__vtk__':
RecursionError: maximum recursion depth exceeded in comparison

Thanks in advance for your help! :blush:

Maybe do Start() after show()
of skip Start() alltogether and start the interactor instead.

In my code I do the following:

    viewer.interactor.Initialize()

    widget.show()
    viewer.interactor.Start()

Thank you @rdbrn for your response. Could you please provide a full example?

You should make calls in the following order after everything else in the pipeline is already set up:

window.show()
interactor.initialize()
interactor.start()

See the example provided here:

Unfortunately, the problem still persists.

Does the following example work for you?
(you may have to replace PySide6 if you are using different python/qt bindings)

from PySide6.QtWidgets import QApplication, QMainWindow

from vtkmodules.vtkFiltersSources import vtkConeSource
from vtkmodules.vtkRenderingCore import vtkActor, vtkPolyDataMapper, vtkRenderer
import vtkmodules.vtkRenderingOpenGL2
import vtkmodules.vtkInteractionStyle
from vtkmodules.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor


# every QT app needs an app
app = QApplication(['QVTKRenderWindowInteractor'])

window = QMainWindow()

# create the widget
widget = QVTKRenderWindowInteractor(window)
window.setCentralWidget(widget)
# if you don't want the 'q' key to exit comment this.
widget.AddObserver("ExitEvent", lambda o, e, a=app: a.quit())

ren = vtkRenderer()
widget.GetRenderWindow().AddRenderer(ren)

cone = vtkConeSource()
cone.SetResolution(8)

coneMapper = vtkPolyDataMapper()
coneMapper.SetInputConnection(cone.GetOutputPort())

coneActor = vtkActor()
coneActor.SetMapper(coneMapper)

ren.AddActor(coneActor)

# show the widget
window.show()

widget.Initialize()
widget.Start()

app.exec()