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

Skip to content

Commit 82ff273

Browse files
committed
Simplify CheckButtons and RadioButtons click handler.
Shorten the code that determines which button has been clicked. Use Text.contains directly (it calls text.get_window_extent itself) rather than manually going through text.get_window_extent. The previous code for finding the closest click was actually wrong (transAxes.inverted().transform((event.x, event.y)) is in axes space, but get_offset_transform().transform(get_offsets()) is in screen space, so they cannot be subtracted from one another) but it didn't really matter because a click is, in practice, always contained by a single button anyways (idxs has length at most 1). Still, fix that.
1 parent 37f26da commit 82ff273

File tree

1 file changed

+16
-25
lines changed

1 file changed

+16
-25
lines changed

lib/matplotlib/widgets.py

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1118,19 +1118,14 @@ def _clear(self, event):
11181118
def _clicked(self, event):
11191119
if self.ignore(event) or event.button != 1 or not self.ax.contains(event)[0]:
11201120
return
1121-
pclicked = self.ax.transAxes.inverted().transform((event.x, event.y))
1122-
distances = {}
1123-
_, frame_inds = self._frames.contains(event)
1124-
coords = self._frames.get_offset_transform().transform(
1125-
self._frames.get_offsets()
1126-
)
1127-
for i, t in enumerate(self.labels):
1128-
if (i in frame_inds["ind"]
1129-
or t.get_window_extent().contains(event.x, event.y)):
1130-
distances[i] = np.linalg.norm(pclicked - coords[i])
1131-
if len(distances) > 0:
1132-
closest = min(distances, key=distances.get)
1133-
self.set_active(closest)
1121+
idxs = [ # Indices of frames and of texts that contain the event.
1122+
*self._frames.contains(event)[1]["ind"],
1123+
*[i for i, text in enumerate(self.labels) if text.contains(event)[0]]]
1124+
if idxs:
1125+
coords = self._frames.get_offset_transform().transform(
1126+
self._frames.get_offsets())
1127+
self.set_active( # Closest index, only looking in idxs.
1128+
idxs[(((event.x, event.y) - coords[idxs]) ** 2).sum(-1).argmin()])
11341129

11351130
def set_label_props(self, props):
11361131
"""
@@ -1656,18 +1651,14 @@ def _clear(self, event):
16561651
def _clicked(self, event):
16571652
if self.ignore(event) or event.button != 1 or not self.ax.contains(event)[0]:
16581653
return
1659-
pclicked = self.ax.transAxes.inverted().transform((event.x, event.y))
1660-
_, inds = self._buttons.contains(event)
1661-
coords = self._buttons.get_offset_transform().transform(
1662-
self._buttons.get_offsets())
1663-
distances = {}
1664-
for i, t in enumerate(self.labels):
1665-
if (i in inds["ind"]
1666-
or t.get_window_extent().contains(event.x, event.y)):
1667-
distances[i] = np.linalg.norm(pclicked - coords[i])
1668-
if len(distances) > 0:
1669-
closest = min(distances, key=distances.get)
1670-
self.set_active(closest)
1654+
idxs = [ # Indices of buttons and of texts that contain the event.
1655+
*self._buttons.contains(event)[1]["ind"],
1656+
*[i for i, text in enumerate(self.labels) if text.contains(event)[0]]]
1657+
if idxs:
1658+
coords = self._buttons.get_offset_transform().transform(
1659+
self._buttons.get_offsets())
1660+
self.set_active( # Closest index, only looking in idxs.
1661+
idxs[(((event.x, event.y) - coords[idxs]) ** 2).sum(-1).argmin()])
16711662

16721663
def set_label_props(self, props):
16731664
"""

0 commit comments

Comments
 (0)