diff --git a/doc/api/next_api_changes/deprecations/21992-AL.rst b/doc/api/next_api_changes/deprecations/21992-AL.rst new file mode 100644 index 000000000000..e3bdaba31267 --- /dev/null +++ b/doc/api/next_api_changes/deprecations/21992-AL.rst @@ -0,0 +1,4 @@ +``lastrect`` +~~~~~~~~~~~~ +The ``lastrect`` attribute of ``NavigationToolbar2Tk`` and ``RubberbandTk`` is +deprecated. diff --git a/lib/matplotlib/backends/_backend_gtk.py b/lib/matplotlib/backends/_backend_gtk.py index 2b095c3bc7a9..9c0beae00890 100644 --- a/lib/matplotlib/backends/_backend_gtk.py +++ b/lib/matplotlib/backends/_backend_gtk.py @@ -151,10 +151,7 @@ def remove_rubberband(self): self._make_classic_style_pseudo_toolbar()) -class ConfigureSubplotsGTK(backend_tools.ConfigureSubplotsBase, Gtk.Window): - def _get_canvas(self, fig): - return self.canvas.__class__(fig) - +class ConfigureSubplotsGTK(backend_tools.ConfigureSubplotsBase): def trigger(self, *args): _NavigationToolbar2GTK.configure_subplots( self._make_classic_style_pseudo_toolbar(), None) diff --git a/lib/matplotlib/backends/_backend_tk.py b/lib/matplotlib/backends/_backend_tk.py index eb34c6b569e9..a7caaf0fb4f5 100644 --- a/lib/matplotlib/backends/_backend_tk.py +++ b/lib/matplotlib/backends/_backend_tk.py @@ -19,8 +19,6 @@ _Backend, FigureCanvasBase, FigureManagerBase, NavigationToolbar2, TimerBase, ToolContainerBase, cursors, _Mode) from matplotlib._pylab_helpers import Gcf -from matplotlib.figure import Figure -from matplotlib.widgets import SubplotTool from . import _tkagg @@ -211,6 +209,8 @@ def filter_destroy(event): self._tkcanvas.focus_set() + self._rubberband_rect = None + def _update_device_pixel_ratio(self, event=None): # Tk gives scaling with respect to 72 DPI, but most (all?) screens are # scaled vs 96 dpi, and pixel ratio settings are given in whole @@ -609,16 +609,22 @@ def set_message(self, s): self.message.set(s) def draw_rubberband(self, event, x0, y0, x1, y1): - self.remove_rubberband() + # Block copied from remove_rubberband for backend_tools convenience. + if self.canvas._rubberband_rect: + self.canvas._tkcanvas.delete(self.canvas._rubberband_rect) height = self.canvas.figure.bbox.height y0 = height - y0 y1 = height - y1 - self.lastrect = self.canvas._tkcanvas.create_rectangle(x0, y0, x1, y1) + self.canvas._rubberband_rect = self.canvas._tkcanvas.create_rectangle( + x0, y0, x1, y1) def remove_rubberband(self): - if hasattr(self, "lastrect"): - self.canvas._tkcanvas.delete(self.lastrect) - del self.lastrect + if self.canvas._rubberband_rect: + self.canvas._tkcanvas.delete(self.canvas._rubberband_rect) + self.canvas._rubberband_rect = None + + lastrect = _api.deprecated("3.6")( + property(lambda self: self.canvas._rubberband_rect)) def set_cursor(self, cursor): window = self.canvas.get_tk_widget().master @@ -777,17 +783,15 @@ def hidetip(self): @backend_tools._register_tool_class(FigureCanvasTk) class RubberbandTk(backend_tools.RubberbandBase): def draw_rubberband(self, x0, y0, x1, y1): - self.remove_rubberband() - height = self.figure.canvas.figure.bbox.height - y0 = height - y0 - y1 = height - y1 - self.lastrect = self.figure.canvas._tkcanvas.create_rectangle( - x0, y0, x1, y1) + NavigationToolbar2Tk.draw_rubberband( + self._make_classic_style_pseudo_toolbar(), None, x0, y0, x1, y1) def remove_rubberband(self): - if hasattr(self, "lastrect"): - self.figure.canvas._tkcanvas.delete(self.lastrect) - del self.lastrect + NavigationToolbar2Tk.remove_rubberband( + self._make_classic_style_pseudo_toolbar()) + + lastrect = _api.deprecated("3.6")( + property(lambda self: self.figure.canvas._rubberband_rect)) @_api.deprecated("3.5", alternative="ToolSetCursor") @@ -869,32 +873,9 @@ def trigger(self, *args): @backend_tools._register_tool_class(FigureCanvasTk) class ConfigureSubplotsTk(backend_tools.ConfigureSubplotsBase): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.window = None - def trigger(self, *args): - self.init_window() - self.window.lift() - - def init_window(self): - if self.window: - return - - toolfig = Figure(figsize=(6, 3)) - self.window = tk.Tk() - - canvas = type(self.canvas)(toolfig, master=self.window) - toolfig.subplots_adjust(top=0.9) - SubplotTool(self.figure, toolfig) - canvas.draw() - canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1) - self.window.protocol("WM_DELETE_WINDOW", self.destroy) - - def destroy(self, *args, **kwargs): - if self.window is not None: - self.window.destroy() - self.window = None + NavigationToolbar2Tk.configure_subplots( + self._make_classic_style_pseudo_toolbar()) @backend_tools._register_tool_class(FigureCanvasTk) diff --git a/lib/matplotlib/backends/backend_gtk3.py b/lib/matplotlib/backends/backend_gtk3.py index 1bd8b7334eca..05a8888e6f73 100644 --- a/lib/matplotlib/backends/backend_gtk3.py +++ b/lib/matplotlib/backends/backend_gtk3.py @@ -615,11 +615,8 @@ def set_message(self, s): @backend_tools._register_tool_class(FigureCanvasGTK3) class SaveFigureGTK3(backend_tools.SaveFigureBase): def trigger(self, *args, **kwargs): - - class PseudoToolbar: - canvas = self.figure.canvas - - return NavigationToolbar2GTK3.save_figure(PseudoToolbar()) + NavigationToolbar2GTK3.save_figure( + self._make_classic_style_pseudo_toolbar()) @_api.deprecated("3.5", alternative="ToolSetCursor") diff --git a/lib/matplotlib/backends/backend_gtk4.py b/lib/matplotlib/backends/backend_gtk4.py index 74c1317e4eb8..371dd29b06c4 100644 --- a/lib/matplotlib/backends/backend_gtk4.py +++ b/lib/matplotlib/backends/backend_gtk4.py @@ -590,11 +590,8 @@ def set_message(self, s): @backend_tools._register_tool_class(FigureCanvasGTK4) class SaveFigureGTK4(backend_tools.SaveFigureBase): def trigger(self, *args, **kwargs): - - class PseudoToolbar: - canvas = self.figure.canvas - - return NavigationToolbar2GTK4.save_figure(PseudoToolbar()) + NavigationToolbar2GTK4.save_figure( + self._make_classic_style_pseudo_toolbar()) @backend_tools._register_tool_class(FigureCanvasGTK4)