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.
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins