106 lines
3.4 KiB
Python
106 lines
3.4 KiB
Python
|
import importlib
|
||
|
import logging
|
||
|
import os
|
||
|
import sys
|
||
|
|
||
|
import matplotlib
|
||
|
from matplotlib import cbook
|
||
|
from matplotlib.backend_bases import _Backend
|
||
|
|
||
|
_log = logging.getLogger(__name__)
|
||
|
|
||
|
|
||
|
# NOTE: plt.switch_backend() (called at import time) will add a "backend"
|
||
|
# attribute here for backcompat.
|
||
|
|
||
|
|
||
|
def _get_running_interactive_framework():
|
||
|
"""
|
||
|
Return the interactive framework whose event loop is currently running, if
|
||
|
any, or "headless" if no event loop can be started, or None.
|
||
|
|
||
|
Returns
|
||
|
-------
|
||
|
Optional[str]
|
||
|
One of the following values: "qt5", "qt4", "gtk3", "wx", "tk",
|
||
|
"macosx", "headless", ``None``.
|
||
|
"""
|
||
|
QtWidgets = (sys.modules.get("PyQt5.QtWidgets")
|
||
|
or sys.modules.get("PySide2.QtWidgets"))
|
||
|
if QtWidgets and QtWidgets.QApplication.instance():
|
||
|
return "qt5"
|
||
|
QtGui = (sys.modules.get("PyQt4.QtGui")
|
||
|
or sys.modules.get("PySide.QtGui"))
|
||
|
if QtGui and QtGui.QApplication.instance():
|
||
|
return "qt4"
|
||
|
Gtk = sys.modules.get("gi.repository.Gtk")
|
||
|
if Gtk and Gtk.main_level():
|
||
|
return "gtk3"
|
||
|
wx = sys.modules.get("wx")
|
||
|
if wx and wx.GetApp():
|
||
|
return "wx"
|
||
|
tkinter = sys.modules.get("tkinter")
|
||
|
if tkinter:
|
||
|
for frame in sys._current_frames().values():
|
||
|
while frame:
|
||
|
if frame.f_code == tkinter.mainloop.__code__:
|
||
|
return "tk"
|
||
|
frame = frame.f_back
|
||
|
if 'matplotlib.backends._macosx' in sys.modules:
|
||
|
if sys.modules["matplotlib.backends._macosx"].event_loop_is_running():
|
||
|
return "macosx"
|
||
|
if sys.platform.startswith("linux") and not os.environ.get("DISPLAY"):
|
||
|
return "headless"
|
||
|
return None
|
||
|
|
||
|
|
||
|
@cbook.deprecated("3.0")
|
||
|
def pylab_setup(name=None):
|
||
|
"""
|
||
|
Return new_figure_manager, draw_if_interactive and show for pyplot.
|
||
|
|
||
|
This provides the backend-specific functions that are used by pyplot to
|
||
|
abstract away the difference between backends.
|
||
|
|
||
|
Parameters
|
||
|
----------
|
||
|
name : str, optional
|
||
|
The name of the backend to use. If `None`, falls back to
|
||
|
``matplotlib.get_backend()`` (which return :rc:`backend`).
|
||
|
|
||
|
Returns
|
||
|
-------
|
||
|
backend_mod : module
|
||
|
The module which contains the backend of choice
|
||
|
|
||
|
new_figure_manager : function
|
||
|
Create a new figure manager (roughly maps to GUI window)
|
||
|
|
||
|
draw_if_interactive : function
|
||
|
Redraw the current figure if pyplot is interactive
|
||
|
|
||
|
show : function
|
||
|
Show (and possibly block) any unshown figures.
|
||
|
"""
|
||
|
# Import the requested backend into a generic module object.
|
||
|
if name is None:
|
||
|
name = matplotlib.get_backend()
|
||
|
backend_name = (name[9:] if name.startswith("module://")
|
||
|
else "matplotlib.backends.backend_{}".format(name.lower()))
|
||
|
backend_mod = importlib.import_module(backend_name)
|
||
|
# Create a local Backend class whose body corresponds to the contents of
|
||
|
# the backend module. This allows the Backend class to fill in the missing
|
||
|
# methods through inheritance.
|
||
|
Backend = type("Backend", (_Backend,), vars(backend_mod))
|
||
|
|
||
|
# Need to keep a global reference to the backend for compatibility reasons.
|
||
|
# See https://github.com/matplotlib/matplotlib/issues/6092
|
||
|
global backend
|
||
|
backend = name
|
||
|
|
||
|
_log.debug('backend %s version %s', name, Backend.backend_version)
|
||
|
return (backend_mod,
|
||
|
Backend.new_figure_manager,
|
||
|
Backend.draw_if_interactive,
|
||
|
Backend.show)
|