@@ -104,7 +104,6 @@ def _copy_docstring_and_deprecators(method, func=None):
104
104
105
105
## Global ##
106
106
107
-
108
107
_IP_REGISTERED = None
109
108
_INSTALL_FIG_OBSERVER = False
110
109
@@ -207,6 +206,28 @@ def _get_required_interactive_framework(backend_mod):
207
206
# Inline this once the deprecation elapses.
208
207
return backend_mod .FigureCanvas .required_interactive_framework
209
208
209
+ _backend_mod = None
210
+
211
+
212
+ def _get_backend_mod ():
213
+ """
214
+ Ensure that a backend is selected and return it.
215
+
216
+ This is currently private, but may be made public in the future.
217
+ """
218
+ if _backend_mod is None :
219
+ # Use __getitem__ here to avoid going through the fallback logic (which
220
+ # will (re)import pyplot and then call switch_backend if we need to
221
+ # resolve the auto sentinel)
222
+ switch_backend (dict .__getitem__ (rcParams , "backend" ))
223
+ # Just to be safe. Interactive mode can be turned on without calling
224
+ # `plt.ion()` so register it again here. This is safe because multiple
225
+ # calls to `install_repl_displayhook` are no-ops and the registered
226
+ # function respects `mpl.is_interactive()` to determine if it should
227
+ # trigger a draw.
228
+ install_repl_displayhook ()
229
+ return _backend_mod
230
+
210
231
211
232
def switch_backend (newbackend ):
212
233
"""
@@ -297,7 +318,7 @@ class backend_mod(matplotlib.backend_bases._Backend):
297
318
298
319
299
320
def _warn_if_gui_out_of_main_thread ():
300
- if (_get_required_interactive_framework (_backend_mod )
321
+ if (_get_required_interactive_framework (_get_backend_mod () )
301
322
and threading .current_thread () is not threading .main_thread ()):
302
323
_api .warn_external (
303
324
"Starting a Matplotlib GUI outside of the main thread will likely "
@@ -308,7 +329,7 @@ def _warn_if_gui_out_of_main_thread():
308
329
def new_figure_manager (* args , ** kwargs ):
309
330
"""Create a new figure manager instance."""
310
331
_warn_if_gui_out_of_main_thread ()
311
- return _backend_mod .new_figure_manager (* args , ** kwargs )
332
+ return _get_backend_mod () .new_figure_manager (* args , ** kwargs )
312
333
313
334
314
335
# This function's signature is rewritten upon backend-load by switch_backend.
@@ -321,7 +342,7 @@ def draw_if_interactive(*args, **kwargs):
321
342
End users will typically not have to call this function because the
322
343
the interactive mode takes care of this.
323
344
"""
324
- return _backend_mod .draw_if_interactive (* args , ** kwargs )
345
+ return _get_backend_mod () .draw_if_interactive (* args , ** kwargs )
325
346
326
347
327
348
# This function's signature is rewritten upon backend-load by switch_backend.
@@ -370,7 +391,7 @@ def show(*args, **kwargs):
370
391
explicitly there.
371
392
"""
372
393
_warn_if_gui_out_of_main_thread ()
373
- return _backend_mod .show (* args , ** kwargs )
394
+ return _get_backend_mod () .show (* args , ** kwargs )
374
395
375
396
376
397
def isinteractive ():
@@ -2226,15 +2247,6 @@ def polar(*args, **kwargs):
2226
2247
set (_interactive_bk ) - {'WebAgg' , 'nbAgg' })
2227
2248
and cbook ._get_running_interactive_framework ()):
2228
2249
dict .__setitem__ (rcParams , "backend" , rcsetup ._auto_backend_sentinel )
2229
- # Set up the backend.
2230
- switch_backend (rcParams ["backend" ])
2231
-
2232
- # Just to be safe. Interactive mode can be turned on without
2233
- # calling `plt.ion()` so register it again here.
2234
- # This is safe because multiple calls to `install_repl_displayhook`
2235
- # are no-ops and the registered function respect `mpl.is_interactive()`
2236
- # to determine if they should trigger a draw.
2237
- install_repl_displayhook ()
2238
2250
2239
2251
2240
2252
################# REMAINING CONTENT GENERATED BY boilerplate.py ##############
0 commit comments