Note
Go to the endto download the full example code.
Embed in wx #3#
Copyright (C) 2003-2004 Andrew Straw, Jeremy O'Donoghue and others
License: This work is licensed under the PSF. A copy should be includedwith this source code, and is also available athttps://docs.python.org/3/license.html
This is yet another example of using matplotlib with wx. Hopefullythis is pretty full-featured:
both matplotlib toolbar and WX buttons manipulate plot
full wxApp framework, including widget interaction
XRC (XML wxWidgets resource) file to create GUI (made with XRCed)
This was derived from embedding_in_wx and dynamic_image_wxagg.
Thanks to matplotlib and wx teams for creating such great software!
importwximportwx.xrcasxrcimportnumpyasnpfrommatplotlib.backends.backend_wxaggimportFigureCanvasWxAggasFigureCanvasfrommatplotlib.backends.backend_wxaggimport \NavigationToolbar2WxAggasNavigationToolbarimportmatplotlib.cbookascbookfrommatplotlib.figureimportFigureERR_TOL=1e-5# floating point slop for peak-detectionclassPlotPanel(wx.Panel):def__init__(self,parent):super().__init__(parent,-1)self.fig=Figure((5,4),75)self.canvas=FigureCanvas(self,-1,self.fig)self.toolbar=NavigationToolbar(self.canvas)# matplotlib toolbarself.toolbar.Realize()# Now put all into a sizersizer=wx.BoxSizer(wx.VERTICAL)# This way of adding to sizer allows resizingsizer.Add(self.canvas,1,wx.LEFT|wx.TOP|wx.GROW)# Best to allow the toolbar to resize!sizer.Add(self.toolbar,0,wx.GROW)self.SetSizer(sizer)self.Fit()definit_plot_data(self):ax=self.fig.add_subplot()x=np.arange(120.0)*2*np.pi/60.0y=np.arange(100.0)*2*np.pi/50.0self.x,self.y=np.meshgrid(x,y)z=np.sin(self.x)+np.cos(self.y)self.im=ax.imshow(z,cmap="RdBu",origin='lower')zmax=np.max(z)-ERR_TOLymax_i,xmax_i=np.nonzero(z>=zmax)ifself.im.origin=='upper':ymax_i=z.shape[0]-ymax_iself.lines=ax.plot(xmax_i,ymax_i,'ko')self.toolbar.update()# Not sure why this is needed - ADSdefGetToolBar(self):# You will need to override GetToolBar if you are using an# unmanaged toolbar in your framereturnself.toolbardefOnWhiz(self,event):self.x+=np.pi/15self.y+=np.pi/20z=np.sin(self.x)+np.cos(self.y)self.im.set_array(z)zmax=np.max(z)-ERR_TOLymax_i,xmax_i=np.nonzero(z>=zmax)ifself.im.origin=='upper':ymax_i=z.shape[0]-ymax_iself.lines[0].set_data(xmax_i,ymax_i)self.canvas.draw()classMyApp(wx.App):defOnInit(self):xrcfile=cbook.get_sample_data('embedding_in_wx3.xrc',asfileobj=False)print('loading',xrcfile)self.res=xrc.XmlResource(xrcfile)# main frame and panel ---------self.frame=self.res.LoadFrame(None,"MainFrame")self.panel=xrc.XRCCTRL(self.frame,"MainPanel")# matplotlib panel -------------# container for matplotlib panel (I like to make a container# panel for our panel so I know where it'll go when in XRCed.)plot_container=xrc.XRCCTRL(self.frame,"plot_container_panel")sizer=wx.BoxSizer(wx.VERTICAL)# matplotlib panel itselfself.plotpanel=PlotPanel(plot_container)self.plotpanel.init_plot_data()# wx boilerplatesizer.Add(self.plotpanel,1,wx.EXPAND)plot_container.SetSizer(sizer)# whiz button ------------------whiz_button=xrc.XRCCTRL(self.frame,"whiz_button")whiz_button.Bind(wx.EVT_BUTTON,self.plotpanel.OnWhiz)# bang button ------------------bang_button=xrc.XRCCTRL(self.frame,"bang_button")bang_button.Bind(wx.EVT_BUTTON,self.OnBang)# final setup ------------------self.frame.Show()self.SetTopWindow(self.frame)returnTruedefOnBang(self,event):bang_count=xrc.XRCCTRL(self.frame,"bang_count")bangs=bang_count.GetValue()bangs=int(bangs)+1bang_count.SetValue(str(bangs))if__name__=='__main__':app=MyApp()app.MainLoop()