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

Skip to content

Commit 3ffb560

Browse files
authored
Fix pan/zoom crashing when widget lock is unavailable (#23373)
* Fix pan/zoom crashing when widget lock is unavailable * Add test for pre-locked zoom/pan
1 parent dfa1f33 commit 3ffb560

File tree

2 files changed

+17
-0
lines changed

2 files changed

+17
-0
lines changed

lib/matplotlib/backend_bases.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3043,6 +3043,9 @@ def pan(self, *args):
30433043
30443044
Pan with left button, zoom with right.
30453045
"""
3046+
if not self.canvas.widgetlock.available(self):
3047+
self.set_message("pan unavailable")
3048+
return
30463049
if self.mode == _Mode.PAN:
30473050
self.mode = _Mode.NONE
30483051
self.canvas.widgetlock.release(self)
@@ -3095,6 +3098,9 @@ def release_pan(self, event):
30953098
self.push_current()
30963099

30973100
def zoom(self, *args):
3101+
if not self.canvas.widgetlock.available(self):
3102+
self.set_message("zoom unavailable")
3103+
return
30983104
"""Toggle zoom to rect mode."""
30993105
if self.mode == _Mode.ZOOM:
31003106
self.mode = _Mode.NONE

lib/matplotlib/tests/test_backend_bases.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,17 @@ def test_interactive_zoom():
175175
assert not ax.get_autoscalex_on() and not ax.get_autoscaley_on()
176176

177177

178+
def test_widgetlock_zoompan():
179+
fig, ax = plt.subplots()
180+
ax.plot([0, 1], [0, 1])
181+
fig.canvas.widgetlock(ax)
182+
tb = NavigationToolbar2(fig.canvas)
183+
tb.zoom()
184+
assert ax.get_navigate_mode() is None
185+
tb.pan()
186+
assert ax.get_navigate_mode() is None
187+
188+
178189
@pytest.mark.parametrize("plot_func", ["imshow", "contourf"])
179190
@pytest.mark.parametrize("orientation", ["vertical", "horizontal"])
180191
@pytest.mark.parametrize("tool,button,expected",

0 commit comments

Comments
 (0)