[vtkusers] wxVTKRenderWindowInteractor inside wxNotebook crashes

Kalle Pahajoki kalpaha at st.jyu.fi
Tue Feb 22 12:26:08 EST 2005


Hi

First of all, I am using Mandrake Linux 10.1 with Nvidia TNT2 and 
NVidia's drivers, wxPython 2.5.3.1 and VTK 4.4 and 
vtk.wx.wxVTKRenderWindowInteractor that comes with it.

I tried to include a wxVTKRenderWindowInteractor (RWI from now on) 
inside a wxNotebook,
so that the RWI was contained in a wxPanel that was a page in the 
notebook (it was a bit more complicated, but the problem reduced
to this when I tried to simplified the code). The code would just crash 
If I ran it. The error messages are generally of the form:

The program 'xxx.py' received an X Window System error.
This probably reflects a bug in the program.
The error was 'BadWindow (invalid Window parameter)'.
(Details: serial 7 error_code 3 request_code 2 minor_code 0)
(Note to programmers: normally, X errors are reported asynchronously;
that is, you will receive the error a while after causing it.
To debug your program, run it with the --sync command line
option to change this behavior. You can then get a meaningful
backtrace from your debugger if you break on the gdk_x_error() function.)

A further detail is that when I tried to run the program using the 
--sync switch, it would then run without crashing.

I then found a simple example that worked, that had the RWI as the 
wxNotebook page itself. I tried to modify the example
to have the RWI inside a panel, and it then crashed similiarly. The 
attached example works, but to get it to crash one will
only need to  add a line

p=wxPanel(self,-1)
and change the line
        wxVTK = wxVTKRenderWindowInteractor(nb, -1)
to have p as RWI's parent:
        wxVTK = wxVTKRenderWindowInteractor(p, -1)
and then change the code from:
        nb.AddPage(wxVTK, "wxVTK")
to add p as the page:
        nb.AddPage(p, "wxVTK")

Is there a way to get the RWI contained in a wxPanel working as a 
wxNotebook page?

Kalle Pahajoki

<-- Example of RWI inside wxNotebook, works -->
import sys
from wxPython.wx import *
from vtk import *
from vtk.wx.wxVTKRenderWindowInteractor import *

class MainFrame(wxFrame):

    def __init__(self, parent=None):
        wxFrame.__init__(self, parent, -1, "test", size = (400, 400))
        nb = wxNotebook(self, -1)
        # First page is empty just to postpone wxVTKRenderWindow
        nb.AddPage(wxWindow(nb, -1), "splash")
       
        wxVTK = wxVTKRenderWindowInteractor(nb, -1)
        ren = vtkRenderer ()
        wxVTK.GetRenderWindow ().AddRenderer (ren)

        nb.AddPage(wxVTK, "wxVTK")
        nb.Refresh()
        # Some other actors are added lately...
        Mapper = vtkPolyDataMapper()
        Plane = vtkPlaneSource()
       #Comment out the following line and it will work
        #Mapper.SetInput(Plane.GetOutput())
        Actor = vtkActor()
        Actor.SetMapper(Mapper)
        ren.AddActor(Actor)
   
class MyApp(wxApp):
    def OnInit(self):
        frame = MainFrame()
        frame.Show(true)
        self.SetTopWindow(frame)
        wxYield()
        return true

main = MyApp(0)
main.MainLoop()






More information about the vtkusers mailing list