Matplotlib navtoolbar does not implement in wx 2.9 (Mac OS X)

The following code snippet creates matplotlib NavToolbar2 at the top of the frame, as expected when running on wxPython 2.8.x, Python 2.5.4 / 2.6, Matplotlib 0.99.x.

However, I recently switched to Python 2.7 and wxPython 2.9.1, trying to support OS X in the 64-bit version. In this environment, an empty toolbar is created in the code below:

empty toolbar

I noticed when creating matplotlib that he said something that WxAgg is not needed for wx 2.9 and higher, maybe this is a problem? All I have tried so far is to replace FigureCanvasWxAgg with FigureCanvasWx and NavigationToolbar2WxAgg with NavigationToolbar2Wx . Bad luck.

Any ideas what is going on?

 import wx from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg, NavigationToolbar2WxAgg import matplotlib as mpl app = wx.PySimpleApp() f = wx.Frame(None) fig = mpl.figure.Figure() p = FigureCanvasWxAgg(f, -1, fig) tb = NavigationToolbar2WxAgg(fig.canvas) f.SetToolBar(tb) tb.Realize() f.Show() app.MainLoop() 

One more thing ... if I replaced NavigationToolbar2WxAgg with my own navtoolbar class (code when I first answered this thread: Add new navigation modes to matplotlib ), all this happens if I do not delete tb.Realize() .

 2011-05-25 08:21:18.354 Python[48013:60f] *** Assertion failure in -[NSToolbar _itemAtIndex:], /SourceCache/AppKit/AppKit-1038.35/Toolbar.subproj/NSToolbar.m:1227 2011-05-25 08:21:18.356 Python[48013:60f] An uncaught exception was raised 2011-05-25 08:21:18.356 Python[48013:60f] Invalid parameter not satisfying: index>=0 && index<[self _numberOfItems] 2011-05-25 08:21:18.358 Python[48013:60f] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: index>=0 && index<[self _numberOfItems]' *** Call stack at first throw: ( 0 CoreFoundation 0x00007fff868ef7b4 __exceptionPreprocess + 180 1 libobjc.A.dylib 0x00007fff83e9b0f3 objc_exception_throw + 45 2 CoreFoundation 0x00007fff868ef5d7 +[NSException raise:format:arguments:] + 103 3 Foundation 0x00007fff86d7c77e -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 198 4 AppKit 0x00007fff806f44a9 -[NSToolbar _itemAtIndex:] + 158 5 AppKit 0x00007fff806f3e94 -[NSToolbar _removeItemAtIndex:notifyDelegate:notifyView:notifyFamilyAndUpdateDefaults:] + 56 6 libwx_osx_cocoau-2.9.1.0.0.dylib 0x0000000101aea2a6 _ZN9wxToolBar7RealizeEv + 1430 7 _controls_.so 0x00000001048d4b76 _wrap_ToolBarBase_Realize + 102 8 .Python 0x00000001000ca81a PyEval_EvalFrameEx + 23498 9 .Python 0x00000001000cc8c5 PyEval_EvalCodeEx + 1733 10 .Python 0x00000001000ca9bf PyEval_EvalFrameEx + 23919 11 .Python 0x00000001000cc8c5 PyEval_EvalCodeEx + 1733 12 .Python 0x00000001000cb0c8 PyEval_EvalFrameEx + 25720 13 .Python 0x00000001000cc8c5 PyEval_EvalCodeEx + 1733 14 .Python 0x00000001000ca9bf PyEval_EvalFrameEx + 23919 15 .Python 0x00000001000cb2a6 PyEval_EvalFrameEx + 26198 16 .Python 0x00000001000cb2a6 PyEval_EvalFrameEx + 26198 17 .Python 0x00000001000cc8c5 PyEval_EvalCodeEx + 1733 18 .Python 0x00000001000ca9bf PyEval_EvalFrameEx + 23919 19 .Python 0x00000001000cb2a6 PyEval_EvalFrameEx + 26198 20 .Python 0x00000001000cc8c5 PyEval_EvalCodeEx + 1733 21 .Python 0x00000001000ccbc6 PyEval_EvalCode + 54 22 .Python 0x00000001000f0c7e PyRun_FileExFlags + 174 23 .Python 0x00000001000f1aa1 PyRun_SimpleFileExFlags + 817 24 .Python 0x00000001001093d9 Py_Main + 2825 25 Python 0x0000000100000f54 0x0 + 4294971220 ) terminate called after throwing an instance of 'NSException' 
+4
source share
1 answer

This seems to be a bug, but I don't know if the problem lies in matplotlib, in wxPython or in backend_wx.py. What I did to fix this, I looked in the backend_wx.py source code for the toolbar and placed it directly in my wxPython toolbar. So this works for me:

 import os import wx from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg, NavigationToolbar2WxAgg from matplotlib.backends.backend_wx import _load_bitmap import matplotlib as mpl app = wx.PySimpleApp() f = wx.Frame(None) fig = mpl.figure.Figure() p = FigureCanvasWxAgg(f, -1, fig) toolbar = NavigationToolbar2WxAgg(p) toolbar.Hide() #toolbar constants TBFLAGS = (wx.TB_HORIZONTAL|wx.TB_TEXT) tsize = (24,24) tb = f.CreateToolBar(TBFLAGS) _NTB2_HOME = wx.NewId() _NTB2_BACK = wx.NewId() _NTB2_FORWARD = wx.NewId() _NTB2_PAN = wx.NewId() _NTB2_ZOOM = wx.NewId() _NTB2_SAVE = wx.NewId() _NTB2_SUBPLOT = wx.NewId() tb.AddSimpleTool(_NTB2_HOME, _load_bitmap('home.png'), 'Home', 'Reset original view') tb.AddSimpleTool(_NTB2_BACK, _load_bitmap('back.png'), 'Back', 'Back navigation view') tb.AddSimpleTool(_NTB2_FORWARD, _load_bitmap('forward.png'), 'Forward', 'Forward navigation view') tb.AddCheckTool(_NTB2_PAN, _load_bitmap('move.png'), shortHelp='Pan', longHelp='Pan with left, zoom with right') tb.AddCheckTool(_NTB2_ZOOM, _load_bitmap('zoom_to_rect.png'), shortHelp='Zoom', longHelp='Zoom to rectangle') tb.AddSeparator() tb.AddSimpleTool(_NTB2_SUBPLOT, _load_bitmap('subplots.png'), 'Configure subplots', 'Configure subplot parameters') tb.AddSimpleTool(_NTB2_SAVE, _load_bitmap('filesave.png'), 'Save', 'Save plot contents to file') f.Bind(wx.EVT_TOOL, toolbar.home, id=_NTB2_HOME) f.Bind(wx.EVT_TOOL, toolbar.forward, id=_NTB2_FORWARD) f.Bind(wx.EVT_TOOL, toolbar.back, id=_NTB2_BACK) f.Bind(wx.EVT_TOOL, toolbar.zoom, id=_NTB2_ZOOM) f.Bind(wx.EVT_TOOL, toolbar.pan, id=_NTB2_PAN) f.Bind(wx.EVT_TOOL, toolbar.configure_subplot, id=_NTB2_SUBPLOT) f.Bind(wx.EVT_TOOL, toolbar.save, id=_NTB2_SAVE) tb.Realize() tb.Realize() f.Show() app.MainLoop() 

This is a quick fix, but some should write a bug report, I think.

+4
source

All Articles