From d1f183aa1587d43395b5b7625354d1323134ffbd Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Thu, 26 Mar 2020 20:50:52 -0400 Subject: [PATCH] Avoid changing dpi in Text.get_window_extent if unspecified. Somehow this causes height changes to propagate from the canvas until it's zero-height (for Tk at least). This is probably a bug, but it's much more subtle and difficult to find, so this patch will suffice for now. --- lib/matplotlib/text.py | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/lib/matplotlib/text.py b/lib/matplotlib/text.py index 77ab7145a7c2..32fe0059314a 100644 --- a/lib/matplotlib/text.py +++ b/lib/matplotlib/text.py @@ -6,6 +6,10 @@ import logging import math import weakref +try: + from contextlib import nullcontext +except ImportError: + from contextlib import ExitStack as nullcontext # Py 3.6. import numpy as np @@ -891,21 +895,26 @@ def get_window_extent(self, renderer=None, dpi=None): #return _unit_box if not self.get_visible(): return Bbox.unit() - if dpi is None: - dpi = self.figure.dpi - if self.get_text() == '': - with cbook._setattr_cm(self.figure, dpi=dpi): + if dpi is not None: + dpi_context = cbook._setattr_cm(self.figure, dpi=dpi) + else: + # This should not be necessary, but causes subtle bugs with some + # backends. + # See https://github.com/matplotlib/matplotlib/issues/16926 + dpi_context = nullcontext() + + with dpi_context: + if self.get_text() == '': tx, ty = self._get_xy_display() return Bbox.from_bounds(tx, ty, 0, 0) - if renderer is not None: - self._renderer = renderer - if self._renderer is None: - self._renderer = self.figure._cachedRenderer - if self._renderer is None: - raise RuntimeError('Cannot get window extent w/o renderer') + if renderer is not None: + self._renderer = renderer + if self._renderer is None: + self._renderer = self.figure._cachedRenderer + if self._renderer is None: + raise RuntimeError('Cannot get window extent w/o renderer') - with cbook._setattr_cm(self.figure, dpi=dpi): bbox, info, descent = self._get_layout(self._renderer) x, y = self.get_unitless_position() x, y = self.get_transform().transform((x, y))