diff --git a/lib/matplotlib/backends/_backend_tk.py b/lib/matplotlib/backends/_backend_tk.py index 49b28532d223..267887db908c 100644 --- a/lib/matplotlib/backends/_backend_tk.py +++ b/lib/matplotlib/backends/_backend_tk.py @@ -642,14 +642,15 @@ def save_figure(self, *args): tkinter.messagebox.showerror("Error saving file", str(e)) def set_history_buttons(self): - if self._nav_stack._pos > 0: - self._buttons['Back']['state'] = tk.NORMAL - else: - self._buttons['Back']['state'] = tk.DISABLED - if self._nav_stack._pos < len(self._nav_stack._elements) - 1: - self._buttons['Forward']['state'] = tk.NORMAL - else: - self._buttons['Forward']['state'] = tk.DISABLED + state_map = {True: tk.NORMAL, False: tk.DISABLED} + can_back = self._nav_stack._pos > 0 + can_forward = self._nav_stack._pos < len(self._nav_stack._elements) - 1 + + if "Back" in self._buttons: + self._buttons['Back']['state'] = state_map[can_back] + + if "Forward" in self._buttons: + self._buttons['Forward']['state'] = state_map[can_forward] class ToolTip: diff --git a/lib/matplotlib/tests/test_backend_tk.py b/lib/matplotlib/tests/test_backend_tk.py index 18ffcb40a0b1..dab2e2a02327 100644 --- a/lib/matplotlib/tests/test_backend_tk.py +++ b/lib/matplotlib/tests/test_backend_tk.py @@ -26,3 +26,16 @@ def evil_blit(photoimage, aggimage, offsets, bboxptr): np.ones((4, 4, 4)), (0, 1, 2, 3), bad_boxes) + + +@pytest.mark.backend('TkAgg', skip_on_importerror=True) +def test_missing_back_button(): + from matplotlib.backends.backend_tkagg import NavigationToolbar2Tk + class Toolbar(NavigationToolbar2Tk): + # only display the buttons we need + toolitems = [t for t in NavigationToolbar2Tk.toolitems if + t[0] in ('Home', 'Pan', 'Zoom')] + + fig = plt.figure() + # this should not raise + Toolbar(fig.canvas, fig.canvas.manager.window)