Former-commit-id:a02aeb236c
[formerly9f19e3f712
] [formerlya02aeb236c
[formerly9f19e3f712
] [formerly06a8b51d6d
[formerly 64fa9254b946eae7e61bbc3f513b7c3696c4f54f]]] Former-commit-id:06a8b51d6d
Former-commit-id:8e80217e59
[formerly3360eb6c5f
] Former-commit-id:377dcd10b9
124 lines
3.9 KiB
Python
Executable file
124 lines
3.9 KiB
Python
Executable file
"""
|
|
Demonstrates how to convert mathtext to a wx.Bitmap for display in various
|
|
controls on wxPython.
|
|
"""
|
|
|
|
import matplotlib
|
|
matplotlib.use("WxAgg")
|
|
from numpy 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, depth = 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()
|
|
|