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

短い答え

1行だけが欠落しています!

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の参照カウントを1つ減らし、後者はxの参照カウントがゼロに達したときにのみ呼び出されます(__del__ドキュメント)。

__del__()失敗(AttributeError)on irenvtkRenderWindowInteractor)および renWinvtkRenderWindow))

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 に答える