VTK do not show image in some situation

I am using VTK im my project. In some situations, vtk do not show image and it really make me confuzed.

Firstly, the following code work:

import vtk, sys
from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class MainWindow(QWidget):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent=parent)

        self.vl = QVBoxLayout()
        self.setLayout(self.vl)
        self.vtkWidget = QVTKRenderWindowInteractor()
        self.vl.addWidget(self.vtkWidget)

        img = vtk.vtkDICOMImageReader()
        img.SetFileName('C:\\Users\\MLoong\\Desktop\\dicom_data\\Chang Cheng\\TOF\\IM_0174')
        img.Update()

        windowLevel = vtk.vtkImageMapToWindowLevelColors()
        windowLevel.SetInputData(img.GetOutput())
        windowLevel.Update()

        actor = vtk.vtkImageActor()
        actor.GetMapper().SetInputConnection(windowLevel.GetOutputPort())

        self.ren = vtk.vtkRenderer()
        self.ren.AddActor(actor)
        self.vtkWidget.GetRenderWindow().AddRenderer(self.ren)
        self.iren = self.vtkWidget.GetRenderWindow().GetInteractor()
        self.iren.RemoveAllObservers()

        self.vtkWidget.GetRenderWindow().Render()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

And the result is:
image

Because the reality project is not a demo. In the reality project, I need to firstly build the pipeline, like:

self.ren = vtk.vtkRenderer()
self.vtkWidget.GetRenderWindow().AddRenderer(self.ren)
self.iren = self.vtkWidget.GetRenderWindow().GetInteractor()

Then, for example, the user will click a button, and the program will show a image. Thus, I modify the above code as following:

import vtk, sys

from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class MainWindow(QWidget):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent=parent)

        self.vl = QVBoxLayout()
        self.setLayout(self.vl)
        self.vtkWidget = QVTKRenderWindowInteractor()
        self.vl.addWidget(self.vtkWidget)

        self.ren = vtk.vtkRenderer()
        # self.ren.AddActor(actor)
        self.vtkWidget.GetRenderWindow().AddRenderer(self.ren)
        self.iren = self.vtkWidget.GetRenderWindow().GetInteractor()
        self.iren.RemoveAllObservers()

        self.vtkWidget.GetRenderWindow().Render()  ############# the flag code

        img = vtk.vtkDICOMImageReader()   ######## move these code to the last
        img.SetFileName('C:\\Users\\MLoong\\Desktop\\dicom_data\\Chang Cheng\\TOF\\IM_0174')
        img.Update()

        windowLevel = vtk.vtkImageMapToWindowLevelColors()
        windowLevel.SetInputData(img.GetOutput())
        windowLevel.Update()

        actor = vtk.vtkImageActor()
        actor.GetMapper().SetInputConnection(windowLevel.GetOutputPort())
        self.ren.AddActor(actor)
        self.vtkWidget.GetRenderWindow().Render()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

What I do is move some code from middle to the last. The result of the above code is:
image

After long time debug, I find what make it wrong.

self.vtkWidget.GetRenderWindow().Render()  ############# the flag code

This code should be removed. If I remove it, the result is OK. But I don’t know why it make this bug.

In addition, I find one code will also cause the same bug:

        self.iren = self.vtkWidget.GetRenderWindow().GetInteractor()
        self.iren.Initialize()
        self.iren.RemoveAllObservers()

Just add iren.Initialize(). And I also don’t know why.

The thing I want to know most is that how should I debug for these situations?

Any suggestion is appreciated!