嵌入Wx3
版权所有(C)2003-2004 Andrew Straw和Jeremy O’Donoghue等人
许可证:此作品根据PSF许可。该文档也应该在 https://docs.python.org/3/license.html 上提供
这是使用matplotlib和wx的另一个例子。 希望这是功能齐全的:
- matplotlib工具栏和WX按钮
- 完整的wxApp框架,包括小部件交互
- XRC(XML wxWidgets资源)文件创建GUI(用XRCed制作)
这是从embedding_in_wx和dynamic_image_wxagg派生的。
感谢matplotlib和wx团队创建这样出色的软件!
import matplotlibimport matplotlib.cm as cmimport matplotlib.cbook as cbookfrom matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvasfrom matplotlib.backends.backend_wxagg import NavigationToolbar2WxAgg as NavigationToolbarfrom matplotlib.figure import Figureimport numpy as npimport wximport wx.xrc as xrcERR_TOL = 1e-5 # floating point slop for peak-detectionmatplotlib.rc('image', origin='lower')class PlotPanel(wx.Panel):def __init__(self, parent):wx.Panel.__init__(self, parent, -1)self.fig = Figure((5, 4), 75)self.canvas = FigureCanvas(self, -1, self.fig)self.toolbar = NavigationToolbar(self.canvas) # matplotlib toolbarself.toolbar.Realize()# self.toolbar.set_active([0,1])# 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()def init_plot_data(self):a = self.fig.add_subplot(111)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 = a.imshow(z, cmap=cm.RdBu) # , interpolation='nearest')zmax = np.max(z) - ERR_TOLymax_i, xmax_i = np.nonzero(z >= zmax)if self.im.origin == 'upper':ymax_i = z.shape[0] - ymax_iself.lines = a.plot(xmax_i, ymax_i, 'ko')self.toolbar.update() # Not sure why this is needed - ADSdef GetToolBar(self):# You will need to override GetToolBar if you are using an# unmanaged toolbar in your framereturn self.toolbardef OnWhiz(self, evt):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)if self.im.origin == 'upper':ymax_i = z.shape[0] - ymax_iself.lines[0].set_data(xmax_i, ymax_i)self.canvas.draw()class MyApp(wx.App):def OnInit(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 ------------------sizer = self.panel.GetSizer()self.frame.Show(1)self.SetTopWindow(self.frame)return Truedef OnBang(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(0)app.MainLoop()
