Note

Go to the endto download the full example code.

Display mathtext in WX#

Demonstrates how to convert (math)text to a wx.Bitmap for display in variouscontrols on wxPython.

fromioimportBytesIOimportwximportnumpyasnpfrommatplotlib.backends.backend_wximportNavigationToolbar2Wxfrommatplotlib.backends.backend_wxaggimportFigureCanvasWxAggasFigureCanvasfrommatplotlib.figureimportFigureIS_WIN='wxMSW'inwx.PlatformInfodefmathtext_to_wxbitmap(s):# We draw the text at position (0, 0) but then rely on# ``facecolor="none"`` and ``bbox_inches="tight", pad_inches=0`` to get a# transparent mask that is then loaded into a wx.Bitmap.fig=Figure(facecolor="none")text_color=(np.array(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT))/255)fig.text(0,0,s,fontsize=10,color=text_color)buf=BytesIO()fig.savefig(buf,format="png",dpi=150,bbox_inches="tight",pad_inches=0)s=buf.getvalue()returnwx.Bitmap.NewFromPNGData(s,len(s))functions=[(r'$\sin(2 \pi x)$',lambdax:np.sin(2*np.pi*x)),(r'$\frac{4}{3}\pi x^3$',lambdax:(4/3)*np.pi*x**3),(r'$\cos(2 \pi x)$',lambdax:np.cos(2*np.pi*x)),(r'$\log(x)$',lambdax:np.log(x))]classCanvasFrame(wx.Frame):def__init__(self,parent,title):super().__init__(parent,-1,title,size=(550,350))self.figure=Figure()self.axes=self.figure.add_subplot()self.canvas=FigureCanvas(self,-1,self.figure)self.change_plot(0)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 toolbarmenuBar=wx.MenuBar()# File Menumenu=wx.Menu()m_exit=menu.Append(wx.ID_EXIT,"E&xit\tAlt-X","Exit this simple sample")menuBar.Append(menu,"&File")self.Bind(wx.EVT_MENU,self.OnClose,m_exit)ifIS_WIN:# Equation Menumenu=wx.Menu()fori,(mt,func)inenumerate(functions):bm=mathtext_to_wxbitmap(mt)item=wx.MenuItem(menu,1000+i," ")item.SetBitmap(bm)menu.Append(item)self.Bind(wx.EVT_MENU,self.OnChangePlot,item)menuBar.Append(menu,"&Functions")self.SetMenuBar(menuBar)self.SetSizer(self.sizer)self.Fit()defadd_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)fori,(mt,func)inenumerate(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)defadd_toolbar(self):"""Copied verbatim from embedding_wx2.py"""self.toolbar=NavigationToolbar2Wx(self.canvas)self.toolbar.Realize()# By adding toolbar in sizer, we are able to put it at the bottom# of the frame - so appearance is closer to GTK version.self.sizer.Add(self.toolbar,0,wx.LEFT|wx.EXPAND)# update the axes menu on the toolbarself.toolbar.update()defOnChangePlot(self,event):self.change_plot(event.GetId()-1000)defchange_plot(self,plot_number):t=np.arange(1.0,3.0,0.01)s=functions[plot_number][1](t)self.axes.clear()self.axes.plot(t,s)self.canvas.draw()defOnClose(self,event):self.Destroy()classMyApp(wx.App):defOnInit(self):frame=CanvasFrame(None,"wxPython mathtext demo app")self.SetTopWindow(frame)frame.Show(True)returnTrueif__name__=="__main__":app=MyApp()app.MainLoop()

Gallery generated by Sphinx-Gallery