[vtkusers] Re: Error msg when destroying a vtkTkRenderWidget

Goodwin Lawlor goodwin.lawlor at ucd.ie
Tue Jun 13 11:53:37 EDT 2006


Roger Blum wrote:
> Hi vtk users,
> 
> I have an application written in Tcl which displays a scene of different 
> actors. The user can select one actor to display in a separate window.
> To acheive this I create a new toplevel widget with an embedded 
> vtkTkRenderWidget. I create a new mapper (as a shallow copy of the original 
> mapper) and a new actor, which I add to the new renderer.
> 
> When I close this separate window the following warning is displayed:
> Generic Warning: In 
> C:\Dashboards\Releases\rc-VTK-5-0-0-rc1\VTK\Rendering\vtkTkRenderWidget.cxx, 
> line 622
> A TkRenderWidget is being destroyed before it associated vtkRenderWindow is 
> destroyed. This is very bad and usually due to the order in which objects 
> are being destroyed. Always destroy the vtkRenderWindow before destroying 
> the user interface components.
> 
> How do I have to destroy/delete the vtk objects created for this separate 
> window? I do not create a vtkRenderWindow explicitly. It is created by the 
> vtkTkRenderWidget. I have tried to delete/destroy the objects in various 
> sequences, nothing helped. A call to
> [tkRenderWidget GetRenderWindow] Delete
> caused error messages complaining about a non existing TempXYZ object.

In short, you have to delete the interactor too (which is created for 
you, if needed). Here's some code to destroy the window, either by 
clicking the destroy button in the title bar or pressing "e".

package require vtk
package require vtkinteraction

#console show
wm withdraw .

toplevel .w

vtkTkRenderWidget .w.renWidget

::vtk::bind_tk_render_widget .w.renWidget

pack .w.renWidget -expand 1 -fill both

set renWin [.w.renWidget GetRenderWindow]

vtkRenderer ren
   $renWin AddRenderer ren

wm protocol .w WM_DELETE_WINDOW cbCloseWindow

set iren [$renWin GetInteractor]
# remove the default callback to exit the app
$iren RemoveObserver [::vtk::get_widget_variable_value $iren ExitEventTag]
$iren AddObserver ExitEvent cbCloseWindow

proc cbCloseWindow {} {
   set renWin [.w.renWidget GetRenderWindow]

   set renCol [$renWin GetRenderers]
   for {$renCol InitTraversal} {[set ren [$renCol GetNextItem]] ne ""} 
{}      {
     $renWin RemoveRenderer $ren
     $ren Delete
   }

   set iren [$renWin GetInteractor]
   $renWin Delete
   $iren Delete
   destroy .w
}

> As a quick and dirty solution: Can I prevent vtk from showing the 
> vtkOutputWindow?

You can direct the error messages to a file using vtkFileOutputWindow
(eg)

vtkFileOutputWindow outputFile
   outputFile SetFileName errors.log
   outputFile SetInstance outputFile

or just switch them off:

     vtkObject obj
     obj GlobalWarningDisplayOff
     obj Delete


hth


Goodwin




More information about the vtkusers mailing list