Embedding Matplotlib in wxpython wx.Panel problem

kyosohma at gmail.com kyosohma at gmail.com
Wed Jul 11 13:05:23 EDT 2007


On Jul 10, 2:09 pm, abakshi11 <abaksh... at gmail.com> wrote:
> I was wondering if you ever got to create a small GUI program that did plots
> using Matplotlib
> I am gettin an error where its saying "WXagg's accelerator requires the
> wxPython headers-the wxpython header files can not be located in any of the
> standard include directories reported by 'wx-config --cppflags'
> Do you think you can help?
>
>
>
> Soren-3 wrote:
>
> > Hi,
>
> > I'm trying to create a small GUI program where I can do plots using
> > Matplotlib. I've been trying to borrow code from the examples at the
> > matplotlib website, but I can't get it to work.
>
> > I want to be able to create a wx.Panel that contains an axis for
> > plotting. Around it i want other panels containing various settings,
> > buttons etc. to control the plot. So far I can't even get the program
> > to actually show a plot in a panel.
>
> > Does anyone here have experience in making a wxpython GUI with
> > matplotlib?
>
> > Any help would be appreciated!
>
> > Thanks,
> > Soren
>
> > My code shows a frame, and I'm trying to set up two panels.. one with
> > a plot and one with a button.. The plotpanel is just a little square
> > in the corner when I run it.. ???
>
> > My code is as follows:
>
> > import wx
> > import pylab
> > from matplotlib.numerix import arange, sin, cos, pi
> > import matplotlib
>
> > matplotlib.use('WXAgg')
> > from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg
> > from matplotlib.backends.backend_wx import NavigationToolbar2Wx
> > from matplotlib.figure import Figure
> > matplotlib.interactive(False)
>
> > class App(wx.App):
>
> >     def OnInit(self):
> >         self.frame = MainFrame("Autoplotter", (50,60), (700,700))
> >         self.frame.Show()
>
> >         return True
>
> > class MainFrame(wx.Frame):
>
> >     def __init__(self, title, pos, size):
> >         wx.Frame.__init__(self, None, -1, title, pos, size)
>
> >         pPanel = PlotPanel(self, -1)            # Plot panel
>
> >         bPanel = ButtonPanel(self, 100,500, (200,100))    # button
> > panel
>
> >         sizer = wx.BoxSizer(wx.VERTICAL)
>
> >         sizer.Add(pPanel,0)
> >         sizer.Add(bPanel,0)
>
> >         self.SetSizer(sizer)
>
> > class ButtonPanel(wx.Panel):
>
> >     def __init__(self, Parent, xPos, yPos, insize):
>
> >         pos = (xPos, yPos)
> >         wx.Panel.__init__(self, Parent, -1, pos, style =
> > wx.RAISED_BORDER, size = insize)
>
> >         button = wx.Button(self, -1, 'HELLO!!', (10,10), (150,50))
>
> > class NoRepaintCanvas(FigureCanvasWxAgg):
> >     """We subclass FigureCanvasWxAgg, overriding the _onPaint method,
> > so that
> >     the draw method is only called for the first two paint events.
> > After that,
> >     the canvas will only be redrawn when it is resized.
> >     """
> >     def __init__(self, *args, **kwargs):
> >         FigureCanvasWxAgg.__init__(self, *args, **kwargs)
> >         self._drawn = 0
>
> >     def _onPaint(self, evt):
> >         """
> >         Called when wxPaintEvt is generated
> >         """
> >         if not self._isRealized:
> >             self.realize()
>
> >         if self._drawn < 2:
> >             self.draw(repaint = False)
> >             self._drawn += 1
>
> >         self.gui_repaint(drawDC=wx.PaintDC(self))
>
> > class PlotPanel(wx.Panel):
>
> >     def __init__(self, parent, id = -1, color = None,\
> >                  dpi = None, style = wx.NO_FULL_REPAINT_ON_RESIZE,
> > **kwargs):
>
> >         wx.Panel.__init__(self, parent, id = id, style = style,
> > **kwargs)
>
> >         self.figure = Figure(None, dpi)
> >         self.canvas = NoRepaintCanvas(self, -1, self.figure)
> >         self._resizeflag = True
>
> >         self.Bind(wx.EVT_IDLE, self._onIdle)
> >         self.Bind(wx.EVT_SIZE, self._onSize)
>
> >         self._SetSize()
>
> >     def draw(self):                           # just draw something!
> >         if not hasattr(self, 'subplot'):
> >             self.subplot = self.figure.add_subplot(111)
> >             theta = arange(0, 45*2*pi, 0.02)
> >             rad = (0.8*theta/(2*pi)+1)
> >             r = rad*(8 + sin(theta*7+rad/1.8))
> >             x = r*cos(theta)
> >             y = r*sin(theta)
> >             #Now draw it
> >             self.subplot.plot(x,y, '-r')
>
> >     def _onSize(self, event):
> >         self._resizeflag = True
>
> >     def _onIdle(self, evt):
> >          if self._resizeflag:
> >              self._resizeflag = False
> >              self._SetSize()
> >              self.draw()
>
> >     def _SetSize(self, pixels = None):
> >         """
> >         This method can be called to force the Plot to be a desired
> > size, which defaults to
> >         the ClientSize of the panel
> >         """
> >         if not pixels:
> >             pixels = self.GetClientSize()
> >         self.canvas.SetSize(pixels)
> >         self.figure.set_figsize_inches(pixels[0]/
> > self.figure.get_dpi(),
> >         pixels[1]/self.figure.get_dpi())
>
> > if __name__ == "__main__":
>
> >     app = App(0)
> >     app.MainLoop()
>
> > --
> >http://mail.python.org/mailman/listinfo/python-list
>
> --
> View this message in context:http://www.nabble.com/Embedding-Matplotlib-in-wxpython-wx.Panel-probl...
> Sent from the Python - python-list mailing list archive at Nabble.com.

You guys should post your wxPython problems to the wxPython user's
list: http://www.wxpython.org/maillist.php

They talk about plotting with matplot (and other modules) on there on
a fairly regular basis.

Mike




More information about the Python-list mailing list