.. note:: :class: sphx-glr-download-link-note Click :ref:`here ` to download the full example code .. rst-class:: sphx-glr-example-title .. _sphx_glr_gallery_user_interfaces_embedding_in_wx3_sgskip.py: ================ Embedding In Wx3 ================ Copyright (C) 2003-2004 Andrew Straw, Jeremy O'Donoghue and others License: This work is licensed under the PSF. A copy should be included with this source code, and is also available at https://docs.python.org/3/license.html This is yet another example of using matplotlib with wx. Hopefully this 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! .. code-block:: python from __future__ import print_function import sys import time import os import gc import matplotlib import matplotlib.cm as cm import matplotlib.cbook as cbook from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas from matplotlib.backends.backend_wxagg import NavigationToolbar2WxAgg as NavigationToolbar from matplotlib.figure import Figure import numpy as np import wx import wx.xrc as xrc ERR_TOL = 1e-5 # floating point slop for peak-detection matplotlib.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 toolbar self.toolbar.Realize() # self.toolbar.set_active([0,1]) # Now put all into a sizer sizer = wx.BoxSizer(wx.VERTICAL) # This way of adding to sizer allows resizing sizer.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.0 y = np.arange(100.0) * 2 * np.pi / 50.0 self.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_TOL ymax_i, xmax_i = np.nonzero(z >= zmax) if self.im.origin == 'upper': ymax_i = z.shape[0] - ymax_i self.lines = a.plot(xmax_i, ymax_i, 'ko') self.toolbar.update() # Not sure why this is needed - ADS def GetToolBar(self): # You will need to override GetToolBar if you are using an # unmanaged toolbar in your frame return self.toolbar def OnWhiz(self, evt): self.x += np.pi / 15 self.y += np.pi / 20 z = np.sin(self.x) + np.cos(self.y) self.im.set_array(z) zmax = np.max(z) - ERR_TOL ymax_i, xmax_i = np.nonzero(z >= zmax) if self.im.origin == 'upper': ymax_i = z.shape[0] - ymax_i self.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 itself self.plotpanel = PlotPanel(plot_container) self.plotpanel.init_plot_data() # wx boilerplate sizer.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 True def OnBang(self, event): bang_count = xrc.XRCCTRL(self.frame, "bang_count") bangs = bang_count.GetValue() bangs = int(bangs) + 1 bang_count.SetValue(str(bangs)) if __name__ == '__main__': app = MyApp(0) app.MainLoop() .. _sphx_glr_download_gallery_user_interfaces_embedding_in_wx3_sgskip.py: .. only :: html .. container:: sphx-glr-footer :class: sphx-glr-footer-example .. container:: sphx-glr-download :download:`Download Python source code: embedding_in_wx3_sgskip.py ` .. container:: sphx-glr-download :download:`Download Jupyter notebook: embedding_in_wx3_sgskip.ipynb ` .. only:: html .. rst-class:: sphx-glr-signature Keywords: matplotlib code example, codex, python plot, pyplot `Gallery generated by Sphinx-Gallery `_