[vtkusers] Re: Error msg when destroying a vtkTkRenderWidget

Goodwin Lawlor goodwin.lawlor at ucd.ie
Wed Jun 14 12:20:34 EDT 2006


Roger Blum wrote:
> Thanks a lot for your answer. It was in fact the interactor which was not 
> deleted and caused the warning.
> 
> Thanks for the sample code for handling the closing of a window and dealing 
> with vtk error messages / warnings, too.
> This helps me a lot.
> 
> Roger

Hi Roger,

Actually, looking at the code again... pressing "e" causes a crash. It 
happens when the ExitEvent is invoked but iren's "this->Start" points to 
an observer that has been deleted. I haven't got time to find out what's 
going on. Maybe someone will pick it up again in the future.

Clicking the destroy button in the title bar works ok though.

Goodwin


> "Goodwin Lawlor" <goodwin.lawlor at ucd.ie> schrieb im Newsbeitrag 
> news:e6mn20$vt0$1 at sea.gmane.org...
>> 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





More information about the vtkusers mailing list