@@ -1489,10 +1489,15 @@ def __init__(self, name, canvas, key, x=0, y=0, guiEvent=None):
1489
1489
self .key = key
1490
1490
1491
1491
1492
- def _get_renderer (figure , print_method ):
1492
+ def _get_renderer (figure , print_method , * , draw_disabled = False ):
1493
1493
"""
1494
1494
Get the renderer that would be used to save a `~.Figure`, and cache it on
1495
1495
the figure.
1496
+
1497
+ If *draw_disabled* is True, additionally replace draw_foo methods on
1498
+ *renderer* by no-ops. This is used by the tight-bbox-saving renderer,
1499
+ which needs to walk through the artist tree to compute the tight-bbox, but
1500
+ for which the output file may be closed early.
1496
1501
"""
1497
1502
# This is implemented by triggering a draw, then immediately jumping out of
1498
1503
# Figure.draw() by raising an exception.
@@ -1506,8 +1511,14 @@ def _draw(renderer): raise Done(renderer)
1506
1511
try :
1507
1512
print_method (io .BytesIO ())
1508
1513
except Done as exc :
1509
- figure ._cachedRenderer , = exc .args
1510
- return figure ._cachedRenderer
1514
+ renderer , = figure ._cachedRenderer , = exc .args
1515
+
1516
+ if draw_disabled :
1517
+ for meth_name in dir (RendererBase ):
1518
+ if meth_name .startswith ("draw_" ):
1519
+ setattr (renderer , meth_name , lambda * args , ** kwargs : None )
1520
+
1521
+ return renderer
1511
1522
1512
1523
1513
1524
def _is_non_interactive_terminal_ipython (ip ):
@@ -2058,7 +2069,8 @@ def print_figure(self, filename, dpi=None, facecolor=None, edgecolor=None,
2058
2069
renderer = _get_renderer (
2059
2070
self .figure ,
2060
2071
functools .partial (
2061
- print_method , dpi = dpi , orientation = orientation ))
2072
+ print_method , dpi = dpi , orientation = orientation ),
2073
+ draw_disabled = True )
2062
2074
self .figure .draw (renderer )
2063
2075
bbox_artists = kwargs .pop ("bbox_extra_artists" , None )
2064
2076
bbox_inches = self .figure .get_tightbbox (
0 commit comments