Wx embedding example — mayavi 4.7.2 documentation

# Wx embedding example

This example shows to embed a Mayavi view in a wx frame.

The trick is to create a HasTraits object, as in the mlab_traits_ui.py, mayavi_traits_ui.py, or the modifying_mlab_source.py examples (Mlab traits ui example, Mayavi traits ui example, Mlab interactive dialog example).

Calling the edit_traits method returns a ui object whose control attribute is the wx widget. It can thus be embedded in a standard wx application.

In this example, the wx part is very simple. See Wx mayavi embed in notebook example for an example of more complex embedding of Mayavi scenes in Wx applications.

Python source code: `wx_embedding.py`

    from numpy import ogrid, sin

    from traits.api import HasTraits, Instance
    from traitsui.api import View, Item

    from mayavi.sources.api import ArraySource
    from mayavi.modules.api import IsoSurface

    from mayavi.core.ui.api import SceneEditor, MlabSceneModel

    class MayaviView(HasTraits):

        scene = Instance(MlabSceneModel, ())

        # The layout of the panel created by Traits
        view = View(Item('scene', editor=SceneEditor(), resizable=True,
                        show_label=False),
                        resizable=True)

        def __init__(self):
            HasTraits.__init__(self)
            # Create some data, and plot it using the embedded scene's engine
            x, y, z = ogrid[-10:10:100j, -10:10:100j, -10:10:100j]
            scalars = sin(x*y*z)/(x*y*z)
            src = ArraySource(scalar_data=scalars)
            self.scene.engine.add_source(src)
            src.add_module(IsoSurface())

    #-----------------------------------------------------------------------------
    # Wx Code
    import wx

    class MainWindow(wx.Frame):

        def __init__(self, parent, id):
            wx.Frame.__init__(self, parent, id, 'Mayavi in Wx')
            self.mayavi_view = MayaviView()
            # Use traits to create a panel, and use it as the content of this
            # wx frame.
            self.control = self.mayavi_view.edit_traits(
                            parent=self,
                            kind='subpanel').control
            self.Show(True)

    app = wx.App(False)
    frame = MainWindow(None, wx.ID_ANY)
    app.MainLoop()