考虑以下脚本
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()
如果脚本在那里结束,则一切正常,创建的窗口将被关闭,并且当手动关闭窗口(单击 X)或按下退出键(Q 或 E)时释放资源。
但是,如果有更多语句,您会注意到窗口仍然存在,这是可以理解的,因为我们没有调用任何东西来放弃它,只是结束了交互循环。
通过附加以下内容亲自查看:
temp = raw_input('The window did not close, right? (press Enter)')
根据VTK/示例/Cxx/可视化/CloseWindow http://www.vtk.org/Wiki/VTK/Examples/Cxx/Visualization/CloseWindow, this
iren.GetRenderWindow().Finalize() # equivalent: renWin.Finalize()
iren.TerminateApp()
应该完成工作,但没有。
我还需要做什么才能以编程方式关闭打开的窗口?
简短回答
只少了一行!
del renWin, iren
长答案
您可能会想编写一个函数来处理像这样的窗口关闭
def close_window(iren):
render_window = iren.GetRenderWindow()
render_window.Finalize()
iren.TerminateApp()
del render_window, iren
然后使用它(考虑问题中的脚本):
...
iren.Initialize()
renWin.Render()
iren.Start()
close_window(iren)
这是行不通的。原因是
del x
不直接调用x.__del__()
— 前者递减
x 的引用计数加一,后者仅在以下情况下被调用
x 的引用计数达到零 (__del__文档 http://docs.python.org/2/reference/datamodel.html#object.__del__).
(__del__()
fails (AttributeError
) on iren
(vtkRenderWindowInteractor
) and renWin
(vtkRenderWindow
))
请记住iren
(and renWin
太)是在您的脚本中定义的,因此它具有对函数中(假定)被删除的对象的引用。
这是可行的(尽管该函数不会管理所有窗口关闭的内容):
def close_window(iren):
render_window = iren.GetRenderWindow()
render_window.Finalize()
iren.TerminateApp()
然后使用它:
...
iren.Initialize()
renWin.Render()
iren.Start()
close_window(iren)
del renWin, iren
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)