""" ASAP plotting class based on matplotlib. """ from asap.asaplotbase import * import Tkinter as Tk import matplotlib from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, \ FigureManagerTkAgg # Force use of the newfangled toolbar. matplotlib.rcParams['toolbar'] = 'toolbar2' class asaplotgui(asaplotbase): """ ASAP plotting class based on matplotlib. """ def __init__(self, rows=1, cols=0, title='', size=(8,6), buffering=False): """ Create a new instance of the ASAPlot plotting class. If rows < 1 then a separate call to set_panels() is required to define the panel layout; refer to the doctext for set_panels(). """ v = vars() del v['self'] asaplotbase.__init__(self, **v) self.window = Tk.Tk() def dest_callback(): self.is_dead = True self.window.destroy() self.window.protocol("WM_DELETE_WINDOW", dest_callback) self.canvas = FigureCanvasTkAgg(self.figure, master=self.window) self.canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1) # Simply instantiating this is enough to get a working toolbar. self.figmgr = FigureManagerTkAgg(self.canvas, 1, self.window) self.window.wm_title('ASAP Plotter - Tk') self.events = {'button_press':None, 'button_release':None, 'motion_notify':None} matplotlib.rcParams["interactive"] = True #self.buffering = buffering self.canvas.show() def map(self): """ Reveal the ASAPlot graphics window and bring it to the top of the window stack. """ self.window.wm_deiconify() self.window.lift() # def position(self): # """ # Use the mouse to get a position from a graph. # """ # def position_disable(event): # self.register('button_press', None) # print '%.4f, %.4f' % (event.xdata, event.ydata) # print 'Press any mouse button...' # self.register('button_press', position_disable) def quit(self): """ Destroy the ASAPlot graphics window. """ self.window.destroy() # def region(self): # """ # Use the mouse to get a rectangular region from a plot. # The return value is [x0, y0, x1, y1] in world coordinates. # """ # def region_start(event): # height = self.canvas.figure.bbox.height() # self.rect = {'fig': None, 'height': height, # 'x': event.x, 'y': height - event.y, # 'world': [event.xdata, event.ydata, # event.xdata, event.ydata]} # self.register('button_press', None) # self.register('motion_notify', region_draw) # self.register('button_release', region_disable) # def region_draw(event): # self.canvas._tkcanvas.delete(self.rect['fig']) # self.rect['fig'] = self.canvas._tkcanvas.create_rectangle( # self.rect['x'], self.rect['y'], # event.x, self.rect['height'] - event.y) # def region_disable(event): # self.register('motion_notify', None) # self.register('button_release', None) # self.canvas._tkcanvas.delete(self.rect['fig']) # self.rect['world'][2:4] = [event.xdata, event.ydata] # print '(%.2f, %.2f) (%.2f, %.2f)' % (self.rect['world'][0], # self.rect['world'][1], self.rect['world'][2], # self.rect['world'][3]) # self.register('button_press', region_start) # # This has to be modified to block and return the result (currently # # printed by region_disable) when that becomes possible in matplotlib. # return [0.0, 0.0, 0.0, 0.0] # def register(self, type=None, func=None): # """ # Register, reregister, or deregister events of type 'button_press', # 'button_release', or 'motion_notify'. # The specified callback function should have the following signature: # def func(event) # where event is an MplEvent instance containing the following data: # name # Event name. # canvas # FigureCanvas instance generating the event. # x = None # x position - pixels from left of canvas. # y = None # y position - pixels from bottom of canvas. # button = None # Button pressed: None, 1, 2, 3. # key = None # Key pressed: None, chr(range(255)), shift, # win, or control # inaxes = None # Axes instance if cursor within axes. # xdata = None # x world coordinate. # ydata = None # y world coordinate. # For example: # def mouse_move(event): # print event.xdata, event.ydata # a = asaplot() # a.register('motion_notify', mouse_move) # If func is None, the event is deregistered. # Note that in TkAgg keyboard button presses don't generate an event. # """ # if not self.events.has_key(type): return # if func is None: # if self.events[type] is not None: # # It's not clear that this does anything. # self.canvas.mpl_disconnect(self.events[type]) # self.events[type] = None # # It seems to be necessary to return events to the toolbar. # if type == 'motion_notify': # self.canvas.mpl_connect(type + '_event', # self.figmgr.toolbar.mouse_move) # elif type == 'button_press': # self.canvas.mpl_connect(type + '_event', # self.figmgr.toolbar.press) # elif type == 'button_release': # self.canvas.mpl_connect(type + '_event', # self.figmgr.toolbar.release) # else: # self.events[type] = self.canvas.mpl_connect(type + '_event', func) def show(self, hardrefresh=True): """ Show graphics dependent on the current buffering state. """ if not self.buffering: if hardrefresh: asaplotbase.show(self) self.window.wm_deiconify() self.canvas.show() def terminate(self): """ Clear the figure. """ self.window.destroy() def unmap(self): """ Hide the ASAPlot graphics window. """ self.window.wm_withdraw()