Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 8423793

Browse files
committed
merging from yc-task2
1 parent 73e1f59 commit 8423793

File tree

5 files changed

+79
-3
lines changed

5 files changed

+79
-3
lines changed

doc/api/artist_api.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ Interactive
4444
Artist.pickable
4545
Artist.set_picker
4646
Artist.get_picker
47+
Artist.hover
48+
Artist.hoverable
49+
Artist.set_hover
50+
Artist.get_hover
4751

4852
Clipping
4953
--------

lib/matplotlib/artist.py

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -595,14 +595,52 @@ def get_picker(self):
595595
set_picker, pickable, pick
596596
"""
597597
return self._picker
598+
599+
def hoverable(self):
600+
"""
601+
Return whether the artist is hoverable.
602+
603+
See Also
604+
--------
605+
set_hover, get_hover, hover
606+
"""
607+
return self.figure is not None and self._hover is not None
608+
609+
def hover(self, mouseevent):
610+
"""
611+
Process a hover event.
612+
613+
Each child artist will fire a hover event if *mouseevent* is over
614+
the artist and the artist has hover set.
615+
616+
See Also
617+
--------
618+
set_hover, get_hover, hoverable
619+
"""
620+
from .backend_bases import HoverEvent # Circular import.
621+
# Hover self
622+
if self.hoverable():
623+
hoverer = self.get_hover()
624+
inside, prop = self.contains(mouseevent)
625+
if inside:
626+
HoverEvent("hover_event", self.figure.canvas,
627+
mouseevent, self, **prop)._process()
628+
629+
# Pick children
630+
for a in self.get_children():
631+
# make sure the event happened in the same Axes
632+
ax = getattr(a, 'axes', None)
633+
if (mouseevent.inaxes is None or ax is None
634+
or mouseevent.inaxes == ax):
635+
a.hover(mouseevent)
598636

599637
def set_hover(self, hover):
600638
"""
601639
Define the hover status of the artist.
602640
603641
Parameters
604642
----------
605-
hover : None or bool or float or callable
643+
hover : None or bool
606644
This can be one of the following:
607645
608646
- *None*: Hover is disabled for this artist (default).

lib/matplotlib/backend_bases.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1746,7 +1746,8 @@ class FigureCanvasBase:
17461746
'figure_leave_event',
17471747
'axes_enter_event',
17481748
'axes_leave_event',
1749-
'close_event'
1749+
'close_event',
1750+
'hover_event'
17501751
]
17511752

17521753
fixed_dpi = None
@@ -2297,7 +2298,8 @@ def mpl_connect(self, s, func):
22972298
- 'figure_leave_event',
22982299
- 'axes_enter_event',
22992300
- 'axes_leave_event'
2300-
- 'close_event'.
2301+
- 'close_event'
2302+
- 'hover_event'
23012303
23022304
func : callable
23032305
The callback function to be executed, which must have the
@@ -3009,9 +3011,19 @@ def _mouse_event_to_message(event):
30093011
return ""
30103012

30113013
def mouse_move(self, event):
3014+
from .patches import Rectangle
30123015
self._update_cursor(event)
30133016
self.set_message(self._mouse_event_to_message(event))
30143017

3018+
if callable(getattr(self, 'set_hover_message', None)):
3019+
for a in self.canvas.figure.findobj(match=lambda x: not isinstance(x, Rectangle), include_self=False):
3020+
inside, prop = a.contains(event)
3021+
if inside:
3022+
self.set_hover_message(self._mouse_event_to_message(event))
3023+
else:
3024+
self.set_hover_message("")
3025+
break
3026+
30153027
def _zoom_pan_handler(self, event):
30163028
if self.mode == _Mode.PAN:
30173029
if event.name == "button_press_event":

lib/matplotlib/backends/_backend_tk.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,12 @@ def __init__(self, canvas, window=None, *, pack_toolbar=True):
660660
justify=tk.RIGHT)
661661
self._message_label.pack(side=tk.RIGHT)
662662

663+
self.hover_message = tk.StringVar(master=self)
664+
self._hover_label = tk.Label(master=self, font=self._label_font,
665+
textvariable=self.hover_message,
666+
justify=tk.RIGHT)
667+
self._hover_label.pack(side=tk.RIGHT)
668+
663669
NavigationToolbar2.__init__(self, canvas)
664670
if pack_toolbar:
665671
self.pack(side=tk.BOTTOM, fill=tk.X)
@@ -711,6 +717,9 @@ def zoom(self, *args):
711717
def set_message(self, s):
712718
self.message.set(s)
713719

720+
def set_hover_message(self, s):
721+
self.hover_message.set(s)
722+
714723
def draw_rubberband(self, event, x0, y0, x1, y1):
715724
# Block copied from remove_rubberband for backend_tools convenience.
716725
if self.canvas._rubberband_rect_white:
@@ -987,6 +996,12 @@ def __init__(self, toolmanager, window=None):
987996
self._message_label = tk.Label(master=self, font=self._label_font,
988997
textvariable=self._message)
989998
self._message_label.pack(side=tk.RIGHT)
999+
1000+
self._hover_message = tk.StringVar(master=self)
1001+
self._hover_label = tk.Label(master=self, font=self._label_font,
1002+
textvariable=self._hover_message)
1003+
self._hover_label.pack(side=tk.RIGHT)
1004+
9901005
self._toolitems = {}
9911006
self.pack(side=tk.TOP, fill=tk.X)
9921007
self._groups = {}
@@ -1043,6 +1058,8 @@ def remove_toolitem(self, name):
10431058
def set_message(self, s):
10441059
self._message.set(s)
10451060

1061+
def set_hover_message(self, s):
1062+
self._hover_message.set(s)
10461063

10471064
@backend_tools._register_tool_class(FigureCanvasTk)
10481065
class SaveFigureTk(backend_tools.SaveFigureBase):

lib/matplotlib/figure.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2519,6 +2519,7 @@ def __init__(self,
25192519
]
25202520
self._button_pick_id = connect('button_press_event', self.pick)
25212521
self._scroll_pick_id = connect('scroll_event', self.pick)
2522+
self._hover_id = connect('motion_notify_event', self.hover)
25222523

25232524
if figsize is None:
25242525
figsize = mpl.rcParams['figure.figsize']
@@ -2566,6 +2567,10 @@ def pick(self, mouseevent):
25662567
if not self.canvas.widgetlock.locked():
25672568
super().pick(mouseevent)
25682569

2570+
def hover(self, mouseevent):
2571+
if not self.canvas.widgetlock.locked():
2572+
super().hover(mouseevent)
2573+
25692574
def _check_layout_engines_compat(self, old, new):
25702575
"""
25712576
Helper for set_layout engine

0 commit comments

Comments
 (0)