请考虑以下脚本
import vtk
ren = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
an_actor = vtk.... # create an actor
ren.AddActor(an_actor)
iren.Initialize()
renWin.Render()
iren.Start()
Run Code Online (Sandbox Code Playgroud)
如果脚本在那里结束,一切都会正常,并且当手动关闭窗口(单击X)或按下退出键(Q或E)时,将关闭创建的窗口并释放资源.
但是,如果有更多的语句,你会注意到窗口仍然存在,这是可以理解的,因为我们没有调用任何东西来放弃它,只是结束了交互循环.
通过附加以下内容自行查看:
temp = raw_input('The window did not close, right? (press Enter)')
Run Code Online (Sandbox Code Playgroud)
根据VTK/Examples/Cxx/Visualization/CloseWindow,这个
iren.GetRenderWindow().Finalize() # equivalent: renWin.Finalize()
iren.TerminateApp()
Run Code Online (Sandbox Code Playgroud)
应该完成工作,但事实并非如此.
我还需要做什么才能以编程方式关闭打开的窗口?
gla*_*ain 12
只缺一行!
del renWin, iren
Run Code Online (Sandbox Code Playgroud)
你可能想要制作一个函数来处理像这样的窗口关闭
def close_window(iren):
render_window = iren.GetRenderWindow()
render_window.Finalize()
iren.TerminateApp()
del render_window, iren
Run Code Online (Sandbox Code Playgroud)
然后使用它(考虑问题中的脚本):
...
iren.Initialize()
renWin.Render()
iren.Start()
close_window(iren)
Run Code Online (Sandbox Code Playgroud)
它不会起作用.原因是
del x不直接调用x.__del__()- 前者将x的引用计数递减1,而后者仅在x的引用计数达到零时调用(__del__文档).
(__del__()fail(AttributeError)on iren(vtkRenderWindowInteractor)和 renWin(vtkRenderWindow))
请记住,iren(renWin也是)在脚本中定义,因此它引用了函数中被删除的对象(假设).
这会工作(虽然该功能不会管理所有窗口关闭的东西):
def close_window(iren):
render_window = iren.GetRenderWindow()
render_window.Finalize()
iren.TerminateApp()
Run Code Online (Sandbox Code Playgroud)
然后使用它:
...
iren.Initialize()
renWin.Render()
iren.Start()
close_window(iren)
del renWin, iren
Run Code Online (Sandbox Code Playgroud)