matplotlib navtoolbar在wx2.9(macosx)中无法实现

2024-03-28 15:19:19 发布

您现在位置:Python中文网/ 问答频道 /正文

在wxPython 2.8.x、Python 2.5.4/2.6、matplotlib 0.99.x上运行时,下面的代码在帧顶部生成matplotlib NavToolbar2

不过,我最近迁移到了python2.7和wxpython2.9.1,试图支持64位的osx。正是在这种环境下,下面的代码生成了一个空工具栏:

empty toolbar

我注意到在构建matplotlib时,它说wx2.9及更高版本不需要WxAgg,这可能是问题所在吗?到目前为止,我所做的就是用FigureCanvasWx替换{},用NavigationToolbar2Wx替换{}。运气不好。在

你知道怎么回事吗?在

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()

还有一件事。。。如果我用我自己的自定义navtoolbar类替换NavigationToolbar2WxAgg(这个线程的第一个答案是代码:Add new navigate modes in matplotlib),那么除非我删除tb.Realize(),否则整个过程都会崩溃。在

^{pr2}$

Tags: 代码importapp环境matplotlibwxpythonfigtb
1条回答
网友
1楼 · 发布于 2024-03-28 15:19:19

这看起来像是一个bug,但我不知道问题是出在matplotlib中,还是在wxPython中还是在后端_周x.py. 我所做的是在backend_wx.py source code中查找工具栏并将其直接放入wxPython工具栏中。所以这对我很有用:

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()

这是一个快速修复,但我想有些人必须为此提交一个错误报告。在

相关问题 更多 >