Skip to content

Commit b910442

Browse files
committed
Warn when trying to start a GUI event loop out of the main thread.
1 parent 2f7be9a commit b910442

File tree

1 file changed

+17
-2
lines changed

1 file changed

+17
-2
lines changed

lib/matplotlib/pyplot.py

+17-2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@
2626
import re
2727
import sys
2828
import time
29+
try:
30+
import threading
31+
except ImportError:
32+
import dummy_threading as threading
2933

3034
from cycler import cycler
3135
import matplotlib
@@ -177,6 +181,12 @@ def findobj(o=None, match=None, include_self=True):
177181
return o.findobj(match, include_self=include_self)
178182

179183

184+
def _get_required_interactive_framework():
185+
global _backend_mod
186+
return getattr(
187+
_backend_mod.FigureCanvas, "required_interactive_framework", None)
188+
189+
180190
def switch_backend(newbackend):
181191
"""
182192
Close all open figures and set the Matplotlib backend.
@@ -224,8 +234,7 @@ class _backend_mod(matplotlib.backend_bases._Backend):
224234
_log.debug("Loaded backend %s version %s.",
225235
newbackend, _backend_mod.backend_version)
226236

227-
required_framework = getattr(
228-
_backend_mod.FigureCanvas, "required_interactive_framework", None)
237+
required_framework = _get_required_interactive_framework()
229238
if required_framework is not None:
230239
current_framework = cbook._get_running_interactive_framework()
231240
if (current_framework and required_framework
@@ -248,6 +257,9 @@ class _backend_mod(matplotlib.backend_bases._Backend):
248257

249258
def new_figure_manager(*args, **kwargs):
250259
"""Create a new figure manager instance."""
260+
if (_get_required_interactive_framework()
261+
and threading.current_thread() is not threading.main_thread()):
262+
cbook._warn_external("Don't do this!")
251263
global _backend_mod
252264
return _backend_mod.new_figure_manager(*args, **kwargs)
253265

@@ -276,6 +288,9 @@ def show(*args, **kwargs):
276288
This is experimental, and may be set to ``True`` or ``False`` to
277289
override the blocking behavior described above.
278290
"""
291+
if (_get_required_interactive_framework()
292+
and threading.current_thread() is not threading.main_thread()):
293+
cbook._warn_external("Don't do this!")
279294
global _backend_mod
280295
return _backend_mod.show(*args, **kwargs)
281296

0 commit comments

Comments
 (0)