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

Skip to content

Commit d7a4751

Browse files
authored
Merge pull request #22711 from andrew-fennell/RangeSlider-bugfix
RangeSlider handle set_val bugfix
2 parents f670fe7 + 0c6ccf6 commit d7a4751

File tree

2 files changed

+32
-5
lines changed

2 files changed

+32
-5
lines changed

lib/matplotlib/tests/test_widgets.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1105,19 +1105,30 @@ def test_range_slider(orientation):
11051105
# Check initial value is set correctly
11061106
assert_allclose(slider.val, (0.1, 0.34))
11071107

1108+
def handle_positions(slider):
1109+
if orientation == "vertical":
1110+
return [h.get_ydata()[0] for h in slider._handles]
1111+
else:
1112+
return [h.get_xdata()[0] for h in slider._handles]
1113+
11081114
slider.set_val((0.2, 0.6))
11091115
assert_allclose(slider.val, (0.2, 0.6))
1116+
assert_allclose(handle_positions(slider), (0.2, 0.6))
1117+
11101118
box = slider.poly.get_extents().transformed(ax.transAxes.inverted())
11111119
assert_allclose(box.get_points().flatten()[idx], [0.2, .25, 0.6, .75])
11121120

11131121
slider.set_val((0.2, 0.1))
11141122
assert_allclose(slider.val, (0.1, 0.2))
1123+
assert_allclose(handle_positions(slider), (0.1, 0.2))
11151124

11161125
slider.set_val((-1, 10))
11171126
assert_allclose(slider.val, (0, 1))
1127+
assert_allclose(handle_positions(slider), (0, 1))
11181128

11191129
slider.reset()
1120-
assert_allclose(slider.val, [0.1, 0.34])
1130+
assert_allclose(slider.val, (0.1, 0.34))
1131+
assert_allclose(handle_positions(slider), (0.1, 0.34))
11211132

11221133

11231134
def check_polygon_selector(event_sequence, expected_result, selections_count,

lib/matplotlib/widgets.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -813,7 +813,10 @@ def _update_val_from_pos(self, pos):
813813
val = self._max_in_bounds(pos)
814814
self.set_max(val)
815815
if self._active_handle:
816-
self._active_handle.set_xdata([val])
816+
if self.orientation == "vertical":
817+
self._active_handle.set_ydata([val])
818+
else:
819+
self._active_handle.set_xdata([val])
817820

818821
def _update(self, event):
819822
"""Update the slider position."""
@@ -836,11 +839,16 @@ def _update(self, event):
836839
return
837840

838841
# determine which handle was grabbed
839-
handle = self._handles[
840-
np.argmin(
842+
if self.orientation == "vertical":
843+
handle_index = np.argmin(
844+
np.abs([h.get_ydata()[0] - event.ydata for h in self._handles])
845+
)
846+
else:
847+
handle_index = np.argmin(
841848
np.abs([h.get_xdata()[0] - event.xdata for h in self._handles])
842849
)
843-
]
850+
handle = self._handles[handle_index]
851+
844852
# these checks ensure smooth behavior if the handles swap which one
845853
# has a higher value. i.e. if one is dragged over and past the other.
846854
if handle is not self._active_handle:
@@ -904,14 +912,22 @@ def set_val(self, val):
904912
xy[2] = .75, val[1]
905913
xy[3] = .75, val[0]
906914
xy[4] = .25, val[0]
915+
916+
self._handles[0].set_ydata([val[0]])
917+
self._handles[1].set_ydata([val[1]])
907918
else:
908919
xy[0] = val[0], .25
909920
xy[1] = val[0], .75
910921
xy[2] = val[1], .75
911922
xy[3] = val[1], .25
912923
xy[4] = val[0], .25
924+
925+
self._handles[0].set_xdata([val[0]])
926+
self._handles[1].set_xdata([val[1]])
927+
913928
self.poly.xy = xy
914929
self.valtext.set_text(self._format(val))
930+
915931
if self.drawon:
916932
self.ax.figure.canvas.draw_idle()
917933
self.val = val

0 commit comments

Comments
 (0)