8

考虑以下脚本

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/Examples/Cxx/Visualization/CloseWindow,这

iren.GetRenderWindow().Finalize()  # equivalent: renWin.Finalize()
iren.TerminateApp()

应该完成工作,但事实并非如此。

我还需要做什么才能以编程方式关闭打开的窗口?

4

1 回答 1

14

简短的回答

只少了一行!

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__文档)。

(在( ) 和 ( ) 上__del__()失败 ( ))AttributeErrorirenvtkRenderWindowInteractorrenWinvtkRenderWindow

请记住,iren(并且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
于 2013-03-26T14:53:06.017 回答