Skip to content

Commit 70c7b91

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

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.
@@ -222,8 +232,7 @@ class _backend_mod(matplotlib.backend_bases._Backend):
222232
_log.debug("Loaded backend %s version %s.",
223233
newbackend, _backend_mod.backend_version)
224234

225-
required_framework = getattr(
226-
_backend_mod.FigureCanvas, "required_interactive_framework", None)
235+
required_framework = _get_required_interactive_framework()
227236
if required_framework is not None:
228237
current_framework = cbook._get_running_interactive_framework()
229238
if (current_framework and required_framework
@@ -246,6 +255,9 @@ class _backend_mod(matplotlib.backend_bases._Backend):
246255

247256
def new_figure_manager(*args, **kwargs):
248257
"""Create a new figure manager instance."""
258+
if (_get_required_interactive_framework()
259+
and threading.current_thread() is not threading.main_thread()):
260+
cbook._warn_external("Don't do this!")
249261
global _backend_mod
250262
return _backend_mod.new_figure_manager(*args, **kwargs)
251263

@@ -274,6 +286,9 @@ def show(*args, **kwargs):
274286
This is experimental, and may be set to ``True`` or ``False`` to
275287
override the blocking behavior described above.
276288
"""
289+
if (_get_required_interactive_framework()
290+
and threading.current_thread() is not threading.main_thread()):
291+
cbook._warn_external("Don't do this!")
277292
global _backend_mod
278293
return _backend_mod.show(*args, **kwargs)
279294

0 commit comments

Comments
 (0)