26
26
import re
27
27
import sys
28
28
import time
29
+ try :
30
+ import threading
31
+ except ImportError :
32
+ import dummy_threading as threading
29
33
30
34
from cycler import cycler
31
35
import matplotlib
@@ -177,6 +181,12 @@ def findobj(o=None, match=None, include_self=True):
177
181
return o .findobj (match , include_self = include_self )
178
182
179
183
184
+ def _get_required_interactive_framework ():
185
+ global _backend_mod
186
+ return getattr (
187
+ _backend_mod .FigureCanvas , "required_interactive_framework" , None )
188
+
189
+
180
190
def switch_backend (newbackend ):
181
191
"""
182
192
Close all open figures and set the Matplotlib backend.
@@ -222,8 +232,7 @@ class _backend_mod(matplotlib.backend_bases._Backend):
222
232
_log .debug ("Loaded backend %s version %s." ,
223
233
newbackend , _backend_mod .backend_version )
224
234
225
- required_framework = getattr (
226
- _backend_mod .FigureCanvas , "required_interactive_framework" , None )
235
+ required_framework = _get_required_interactive_framework ()
227
236
if required_framework is not None :
228
237
current_framework = cbook ._get_running_interactive_framework ()
229
238
if (current_framework and required_framework
@@ -244,9 +253,18 @@ class _backend_mod(matplotlib.backend_bases._Backend):
244
253
matplotlib .backends .backend = newbackend
245
254
246
255
256
+ def _warn_if_gui_out_of_main_thread ():
257
+ if (_get_required_interactive_framework ()
258
+ and threading .current_thread () is not threading .main_thread ()):
259
+ cbook ._warn_external (
260
+ "Starting a Matplotlib GUI outside of the main thread will likely "
261
+ "fail." )
262
+
263
+
247
264
def new_figure_manager (* args , ** kwargs ):
248
265
"""Create a new figure manager instance."""
249
266
global _backend_mod
267
+ _warn_if_gui_out_of_main_thread ()
250
268
return _backend_mod .new_figure_manager (* args , ** kwargs )
251
269
252
270
@@ -275,6 +293,7 @@ def show(*args, **kwargs):
275
293
override the blocking behavior described above.
276
294
"""
277
295
global _backend_mod
296
+ _warn_if_gui_out_of_main_thread ()
278
297
return _backend_mod .show (* args , ** kwargs )
279
298
280
299
0 commit comments