Embedding Matplotlib in wxpython wx.Panel problem
abakshi11
abakshi11 at gmail.com
Tue Jul 10 15:09:15 EDT 2007
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-problem-tf3648104.html#a11527402
Sent from the Python - python-list mailing list archive at Nabble.com.
More information about the Python-list
mailing list