From: <jd...@us...> - 2008-11-26 17:43:12
|
Revision: 6454 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=6454&view=rev Author: jdh2358 Date: 2008-11-26 17:43:09 +0000 (Wed, 26 Nov 2008) Log Message: ----------- added figure/axes enter/leave events Modified Paths: -------------- trunk/matplotlib/doc/users/event_handling.rst trunk/matplotlib/lib/matplotlib/backend_bases.py Added Paths: ----------- trunk/matplotlib/examples/event_handling/figure_axes_enter_leave.py Modified: trunk/matplotlib/doc/users/event_handling.rst =================================================================== --- trunk/matplotlib/doc/users/event_handling.rst 2008-11-25 21:43:36 UTC (rev 6453) +++ trunk/matplotlib/doc/users/event_handling.rst 2008-11-26 17:43:09 UTC (rev 6454) @@ -53,15 +53,19 @@ ======================= ====================================================================================== Event name Class and description ======================= ====================================================================================== -'button_press_event' :class:`~matplotlib.backend_bases.MouseEvent` - mouse button is pressed -'button_release_event' :class:`~matplotlib.backend_bases.MouseEvent` - mouse button is released -'draw_event' :class:`~matplotlib.backend_bases.DrawEvent` - canvas draw -'key_press_event' :class:`~matplotlib.backend_bases.KeyEvent` - key is pressed -'key_release_event' :class:`~matplotlib.backend_bases.KeyEvent` - key is released -'motion_notify_event' :class:`~matplotlib.backend_bases.MouseEvent` - mouse motion -'pick_event' :class:`~matplotlib.backend_bases.PickEvent` - an object in the canvas is selected -'resize_event' :class:`~matplotlib.backend_bases.ResizeEvent` - figure canvas is resized -'scroll_event' :class:`~matplotlib.backend_bases.MouseEvent` - mouse scroll wheel is rolled +'button_press_event' :class:`~matplotlib.backend_bases.MouseEvent` - mouse button is pressed +'button_release_event' :class:`~matplotlib.backend_bases.MouseEvent` - mouse button is released +'draw_event' :class:`~matplotlib.backend_bases.DrawEvent` - canvas draw +'key_press_event' :class:`~matplotlib.backend_bases.KeyEvent` - key is pressed +'key_release_event' :class:`~matplotlib.backend_bases.KeyEvent` - key is released +'motion_notify_event' :class:`~matplotlib.backend_bases.MouseEvent` - mouse motion +'pick_event' :class:`~matplotlib.backend_bases.PickEvent` - an object in the canvas is selected +'resize_event' :class:`~matplotlib.backend_bases.ResizeEvent` - figure canvas is resized +'scroll_event' :class:`~matplotlib.backend_bases.MouseEvent` - mouse scroll wheel is rolled +'figure_enter_event' :class:`~matplotlib.backend_bases.LocationEvent` - mouse enters a new figure +'figure_leave_event' :class:`~matplotlib.backend_bases.LocationEvent` - mouse leaves a figure +'axes_enter_event' :class:`~matplotlib.backend_bases.LocationEvent` - mouse enters a new axes +'axes_leave_event' :class:`~matplotlib.backend_bases.LocationEvent` - mouse leaves an axes ======================= ====================================================================================== .. _event-attributes: @@ -330,6 +334,66 @@ plt.show() +.. _enter-leave-events: + +Mouse enter and leave +====================== + +If you want to be notified when the mouse enters or leaves a figure or +axes, you can connect to the figure/axes enter/leave events. Here is +a simple example that changes the colors of the axes and figure +background that the mouse is over:: + + """ + Illustrate the figure and axes enter and leave events by changing the + frame colors on enter and leave + """ + import matplotlib.pyplot as plt + + def enter_axes(event): + print 'enter_axes', event.inaxes + event.inaxes.patch.set_facecolor('yellow') + event.canvas.draw() + + def leave_axes(event): + print 'leave_axes', event.inaxes + event.inaxes.patch.set_facecolor('white') + event.canvas.draw() + + def enter_figure(event): + print 'enter_figure', event.canvas.figure + event.canvas.figure.patch.set_facecolor('red') + event.canvas.draw() + + def leave_figure(event): + print 'leave_figure', event.canvas.figure + event.canvas.figure.patch.set_facecolor('grey') + event.canvas.draw() + + fig1 = plt.figure() + fig1.suptitle('mouse hover over figure or axes to trigger events') + ax1 = fig1.add_subplot(211) + ax2 = fig1.add_subplot(212) + + fig1.canvas.mpl_connect('figure_enter_event', enter_figure) + fig1.canvas.mpl_connect('figure_leave_event', leave_figure) + fig1.canvas.mpl_connect('axes_enter_event', enter_axes) + fig1.canvas.mpl_connect('axes_leave_event', leave_axes) + + fig2 = plt.figure() + fig2.suptitle('mouse hover over figure or axes to trigger events') + ax1 = fig2.add_subplot(211) + ax2 = fig2.add_subplot(212) + + fig2.canvas.mpl_connect('figure_enter_event', enter_figure) + fig2.canvas.mpl_connect('figure_leave_event', leave_figure) + fig2.canvas.mpl_connect('axes_enter_event', enter_axes) + fig2.canvas.mpl_connect('axes_leave_event', leave_axes) + + plt.show() + + + .. _object-picking: Object picking Added: trunk/matplotlib/examples/event_handling/figure_axes_enter_leave.py =================================================================== --- trunk/matplotlib/examples/event_handling/figure_axes_enter_leave.py (rev 0) +++ trunk/matplotlib/examples/event_handling/figure_axes_enter_leave.py 2008-11-26 17:43:09 UTC (rev 6454) @@ -0,0 +1,49 @@ +""" +Illustrate the figure and axes enter and leave events by changing the +frame colors on enter and leave +""" +import matplotlib.pyplot as plt + +def enter_axes(event): + print 'enter_axes', event.inaxes + event.inaxes.patch.set_facecolor('yellow') + event.canvas.draw() + +def leave_axes(event): + print 'leave_axes', event.inaxes + event.inaxes.patch.set_facecolor('white') + event.canvas.draw() + +def enter_figure(event): + print 'enter_figure', event.canvas.figure + event.canvas.figure.patch.set_facecolor('red') + event.canvas.draw() + +def leave_figure(event): + print 'leave_figure', event.canvas.figure + event.canvas.figure.patch.set_facecolor('grey') + event.canvas.draw() + +fig1 = plt.figure() +fig1.suptitle('mouse hover over figure or axes to trigger events') +ax1 = fig1.add_subplot(211) +ax2 = fig1.add_subplot(212) + +fig1.canvas.mpl_connect('figure_enter_event', enter_figure) +fig1.canvas.mpl_connect('figure_leave_event', leave_figure) +fig1.canvas.mpl_connect('axes_enter_event', enter_axes) +fig1.canvas.mpl_connect('axes_leave_event', leave_axes) + +fig2 = plt.figure() +fig2.suptitle('mouse hover over figure or axes to trigger events') +ax1 = fig2.add_subplot(211) +ax2 = fig2.add_subplot(212) + +fig2.canvas.mpl_connect('figure_enter_event', enter_figure) +fig2.canvas.mpl_connect('figure_leave_event', leave_figure) +fig2.canvas.mpl_connect('axes_enter_event', enter_axes) +fig2.canvas.mpl_connect('axes_leave_event', leave_axes) + +plt.show() + + Modified: trunk/matplotlib/lib/matplotlib/backend_bases.py =================================================================== --- trunk/matplotlib/lib/matplotlib/backend_bases.py 2008-11-25 21:43:36 UTC (rev 6453) +++ trunk/matplotlib/lib/matplotlib/backend_bases.py 2008-11-26 17:43:09 UTC (rev 6454) @@ -743,6 +743,9 @@ xdata = None # x coord of mouse in data coords ydata = None # y coord of mouse in data coords + # the last event that was triggered before this one + _lastevent = None + def __init__(self, name, canvas, x, y,guiEvent=None): """ *x*, *y* in figure coords, 0,0 = bottom, left @@ -751,8 +754,12 @@ self.x = x self.y = y + + if x is None or y is None: # cannot check if event was in axes if no x,y info + self.inaxes = False + self._update_enter_leave() return # Find all axes containing the mouse @@ -760,6 +767,7 @@ if len(axes_list) == 0: # None found self.inaxes = None + self._update_enter_leave() return elif (len(axes_list) > 1): # Overlap, get the highest zorder axCmp = lambda _x,_y: cmp(_x.zorder, _y.zorder) @@ -777,6 +785,36 @@ self.xdata = xdata self.ydata = ydata + self._update_enter_leave() + + def _update_enter_leave(self): + 'process the figure/axes enter leave events' + if LocationEvent._lastevent is not None: + last = LocationEvent._lastevent + if last.canvas!=self.canvas: + # process figure enter/leave event + last.canvas.callbacks.process('figure_leave_event', last) + self.canvas.callbacks.process('figure_enter_event', self) + if last.inaxes!=self.inaxes: + # process axes enter/leave events + if last.inaxes is not None: + last.canvas.callbacks.process('axes_leave_event', last) + if self.inaxes is not None: + self.canvas.callbacks.process('axes_enter_event', self) + + else: + # process a figure enter event + self.canvas.callbacks.process('figure_enter_event', self) + # process an axes enter event if we are over an axes + if self.inaxes is not None: + self.canvas.callbacks.process('axes_enter_event', self) + + + LocationEvent._lastevent = self + + + + class MouseEvent(LocationEvent): """ A mouse event ('button_press_event', 'button_release_event', 'scroll_event', @@ -914,6 +952,12 @@ 'motion_notify_event', 'pick_event', 'idle_event', + 'figure_enter_event', + # todo: we only process this when a mouse enters a different + # figure -- we need to connect to the GUI leavel event + 'figure_leave_event', + 'axes_enter_event', + 'axes_leave_event' ] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |