class PlotPanel(wx.Panel): '''A wx panel with a matplotlib canvas. The PlotPanel extends the wx.Panel base class and has a matplotlib Figure and Canvas to draw/plot interesting things on the panel. OnSize events simply set a flag, and the actual resizing of the figure is triggered by an Idle event.''' def __init__(self, parent, color=None, dpi=None, **kwargs): '''Initialisation of the PlotPanel instance.''' from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas ##from matplotlib.backends.backend_agg import NavigationToolbar2Agg as NavigationToolbar # from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas # from matplotlib.backends.backend_wxagg import NavigationToolbar2WxAgg as NavigationToolbar # from matplotlib.backends.backend_wx import FigureCanvasWx as FigureCanvas from matplotlib.figure import Figure # initialize Panel if 'id' not in kwargs.keys(): kwargs['id'] = wx.ID_ANY if 'style' not in kwargs.keys(): kwargs['style'] = wx.NO_FULL_REPAINT_ON_RESIZE wx.Panel.__init__(self, parent, **kwargs) # initialize matplotlib stuff dpi = 72 print 'dpi=', dpi self.figure = Figure((2.0, 2.0), dpi) self.canvas = FigureCanvas(self) ##, -1, self.figure ) self.SetColor(color) ##self.toolbar = NavigationToolbar(self.canvas) self.vbox = wx.BoxSizer(wx.VERTICAL) self.vbox.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW) ##self.vbox.Add(self.toolbar, 0, wx.EXPAND) self.SetSizer(self.vbox) self.vbox.Fit(self) # self._SetSize() self.draw() # self._resizeflag = False # self.Bind(wx.EVT_IDLE, self._onIdle) # self.Bind(wx.EVT_SIZE, self._onSize) def SetColor(self, rgbtuple=None): """Set figure and canvas colours to be the same.""" if rgbtuple is None: rgbtuple = wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNFACE).Get() clr = [c / 255. for c in rgbtuple] self.figure.set_facecolor(clr) self.figure.set_edgecolor(clr) self.canvas.SetBackgroundColour(wx.Colour(*rgbtuple)) def _onSize(self, event): self._resizeflag = True def _onIdle(self, evt): if self._resizeflag: self._resizeflag = False self._SetSize() def _SetSize(self): pixels = tuple(self.parent.GetClientSize()) self.SetSize(pixels) self.canvas.SetSize(pixels) self.figure.set_size_inches(float(pixels[0]) / self.figure.get_dpi(), float(pixels[1]) / self.figure.get_dpi()) def draw(self): pass # abstract, to be overridden by child classes