118 lines
3.6 KiB
Python
Executable file
118 lines
3.6 KiB
Python
Executable file
#!/usr/bin/env python
|
|
"""
|
|
An example of how to use wx or wxagg in an application with a custom
|
|
toolbar
|
|
"""
|
|
|
|
# Used to guarantee to use at least Wx2.8
|
|
import wxversion
|
|
wxversion.ensureMinimal('2.8')
|
|
|
|
from numpy import arange, sin, pi
|
|
|
|
import matplotlib
|
|
|
|
matplotlib.use('WXAgg')
|
|
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
|
|
from matplotlib.backends.backend_wxagg import NavigationToolbar2WxAgg
|
|
|
|
from matplotlib.backends.backend_wx import _load_bitmap
|
|
from matplotlib.figure import Figure
|
|
from numpy.random import rand
|
|
|
|
import wx
|
|
|
|
class MyNavigationToolbar(NavigationToolbar2WxAgg):
|
|
"""
|
|
Extend the default wx toolbar with your own event handlers
|
|
"""
|
|
ON_CUSTOM = wx.NewId()
|
|
def __init__(self, canvas, cankill):
|
|
NavigationToolbar2WxAgg.__init__(self, canvas)
|
|
|
|
# for simplicity I'm going to reuse a bitmap from wx, you'll
|
|
# probably want to add your own.
|
|
self.AddSimpleTool(self.ON_CUSTOM, _load_bitmap('stock_left.xpm'),
|
|
'Click me', 'Activate custom contol')
|
|
wx.EVT_TOOL(self, self.ON_CUSTOM, self._on_custom)
|
|
|
|
def _on_custom(self, evt):
|
|
# add some text to the axes in a random location in axes (0,1)
|
|
# coords) with a random color
|
|
|
|
# get the axes
|
|
ax = self.canvas.figure.axes[0]
|
|
|
|
# generate a random location can color
|
|
x,y = tuple(rand(2))
|
|
rgb = tuple(rand(3))
|
|
|
|
# add the text and draw
|
|
ax.text(x, y, 'You clicked me',
|
|
transform=ax.transAxes,
|
|
color=rgb)
|
|
self.canvas.draw()
|
|
evt.Skip()
|
|
|
|
|
|
class CanvasFrame(wx.Frame):
|
|
|
|
def __init__(self):
|
|
wx.Frame.__init__(self,None,-1,
|
|
'CanvasFrame',size=(550,350))
|
|
|
|
self.SetBackgroundColour(wx.NamedColor("WHITE"))
|
|
|
|
self.figure = Figure(figsize=(5,4), dpi=100)
|
|
self.axes = self.figure.add_subplot(111)
|
|
t = arange(0.0,3.0,0.01)
|
|
s = sin(2*pi*t)
|
|
|
|
self.axes.plot(t,s)
|
|
|
|
self.canvas = FigureCanvas(self, -1, self.figure)
|
|
|
|
self.sizer = wx.BoxSizer(wx.VERTICAL)
|
|
self.sizer.Add(self.canvas, 1, wx.TOP | wx.LEFT | wx.EXPAND)
|
|
# Capture the paint message
|
|
wx.EVT_PAINT(self, self.OnPaint)
|
|
|
|
self.toolbar = MyNavigationToolbar(self.canvas, True)
|
|
self.toolbar.Realize()
|
|
if wx.Platform == '__WXMAC__':
|
|
# Mac platform (OSX 10.3, MacPython) does not seem to cope with
|
|
# having a toolbar in a sizer. This work-around gets the buttons
|
|
# back, but at the expense of having the toolbar at the top
|
|
self.SetToolBar(self.toolbar)
|
|
else:
|
|
# On Windows platform, default window size is incorrect, so set
|
|
# toolbar width to figure width.
|
|
tw, th = self.toolbar.GetSizeTuple()
|
|
fw, fh = self.canvas.GetSizeTuple()
|
|
# By adding toolbar in sizer, we are able to put it at the bottom
|
|
# of the frame - so appearance is closer to GTK version.
|
|
# As noted above, doesn't work for Mac.
|
|
self.toolbar.SetSize(wx.Size(fw, th))
|
|
self.sizer.Add(self.toolbar, 0, wx.LEFT | wx.EXPAND)
|
|
|
|
# update the axes menu on the toolbar
|
|
self.toolbar.update()
|
|
self.SetSizer(self.sizer)
|
|
self.Fit()
|
|
|
|
|
|
def OnPaint(self, event):
|
|
self.canvas.draw()
|
|
event.Skip()
|
|
|
|
class App(wx.App):
|
|
|
|
def OnInit(self):
|
|
'Create the main window and insert the custom frame'
|
|
frame = CanvasFrame()
|
|
frame.Show(True)
|
|
|
|
return True
|
|
|
|
app = App(0)
|
|
app.MainLoop()
|