From: <md...@us...> - 2007-08-31 19:25:36
|
Revision: 3765 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3765&view=rev Author: mdboom Date: 2007-08-31 12:25:34 -0700 (Fri, 31 Aug 2007) Log Message: ----------- Render all the fonts in each mathtext expression to a single image buffer (memory and time savings). Add support for getting raw image data for mathtext expressions. Add mathtext_wx.py example showing how to put mathtext expressions into controls. Added Paths: ----------- trunk/matplotlib/examples/mathtext_wx.py Added: trunk/matplotlib/examples/mathtext_wx.py =================================================================== --- trunk/matplotlib/examples/mathtext_wx.py (rev 0) +++ trunk/matplotlib/examples/mathtext_wx.py 2007-08-31 19:25:34 UTC (rev 3765) @@ -0,0 +1,124 @@ +""" +Demonstrates how to convert mathtext to a wx.Bitmap for display in various +controls on wxPython. +""" + +import matplotlib +matplotlib.use("WxAgg") +from matplotlib.numerix import arange, sin, pi, cos, log +from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas +from matplotlib.backends.backend_wx import NavigationToolbar2Wx +from matplotlib.figure import Figure + +import wx + +IS_GTK = 'wxGTK' in wx.PlatformInfo +IS_WIN = 'wxMSW' in wx.PlatformInfo +IS_MAC = 'wxMac' in wx.PlatformInfo + +############################################################ +# This is where the "magic" happens. +from matplotlib.mathtext import MathTextParser +mathtext_parser = MathTextParser("Bitmap") +def mathtext_to_wxbitmap(s): + ftimage = mathtext_parser.parse(s, 150) + return wx.BitmapFromBufferRGBA( + ftimage.get_width(), ftimage.get_height(), + ftimage.as_rgba_str()) +############################################################ + +functions = [ + (r'$\sin(2 \pi x)$' , lambda x: sin(2*pi*x)), + (r'$\frac{4}{3}\pi x^3$' , lambda x: (4.0 / 3.0) * pi * x**3), + (r'$\cos(2 \pi x)$' , lambda x: cos(2*pi*x)), + (r'$\log x$' , lambda x: log(x)) +] + +class CanvasFrame(wx.Frame): + def __init__(self, parent, title): + wx.Frame.__init__(self, parent, -1, title, size=(550, 350)) + self.SetBackgroundColour(wx.NamedColor("WHITE")) + + self.figure = Figure() + self.axes = self.figure.add_subplot(111) + self.change_plot(0) + + self.canvas = FigureCanvas(self, -1, self.figure) + + self.sizer = wx.BoxSizer(wx.VERTICAL) + self.add_buttonbar() + self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW) + self.add_toolbar() # comment this out for no toolbar + + menuBar = wx.MenuBar() + + # File Menu + menu = wx.Menu() + menu.Append(wx.ID_EXIT, "E&xit\tAlt-X", "Exit this simple sample") + menuBar.Append(menu, "&File") + + if IS_GTK or IS_WIN: + # Equation Menu + menu = wx.Menu() + for i, (mt, func) in enumerate(functions): + bm = mathtext_to_wxbitmap(mt) + item = wx.MenuItem(menu, 1000 + i, "") + item.SetBitmap(bm) + menu.AppendItem(item) + self.Bind(wx.EVT_MENU, self.OnChangePlot, item) + menuBar.Append(menu, "&Functions") + + self.SetMenuBar(menuBar) + + self.SetSizer(self.sizer) + self.Fit() + + def add_buttonbar(self): + self.button_bar = wx.Panel(self) + self.button_bar_sizer = wx.BoxSizer(wx.HORIZONTAL) + self.sizer.Add(self.button_bar, 0, wx.LEFT | wx.TOP | wx.GROW) + + for i, (mt, func) in enumerate(functions): + bm = mathtext_to_wxbitmap(mt) + button = wx.BitmapButton(self.button_bar, 1000 + i, bm) + self.button_bar_sizer.Add(button, 1, wx.GROW) + self.Bind(wx.EVT_BUTTON, self.OnChangePlot, button) + + self.button_bar.SetSizer(self.button_bar_sizer) + + def add_toolbar(self): + """Copied verbatim from embedding_wx2.py""" + self.toolbar = NavigationToolbar2Wx(self.canvas) + self.toolbar.Realize() + if IS_MAC: + self.SetToolBar(self.toolbar) + else: + tw, th = self.toolbar.GetSizeTuple() + fw, fh = self.canvas.GetSizeTuple() + self.toolbar.SetSize(wx.Size(fw, th)) + self.sizer.Add(self.toolbar, 0, wx.LEFT | wx.EXPAND) + self.toolbar.update() + + def OnPaint(self, event): + self.canvas.draw() + + def OnChangePlot(self, event): + self.change_plot(event.GetId() - 1000) + + def change_plot(self, plot_number): + t = arange(1.0,3.0,0.01) + s = functions[plot_number][1](t) + self.axes.clear() + self.axes.plot(t, s) + self.Refresh() + +class MyApp(wx.App): + def OnInit(self): + frame = CanvasFrame(None, "wxPython mathtext demo app") + self.SetTopWindow(frame) + frame.Show(True) + return True + +app = MyApp() +app.MainLoop() + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |