| | """ Import Qt in a manner suitable for an IPython kernel. |
| | |
| | This is the import used for the `gui=qt` or `matplotlib=qt` initialization. |
| | |
| | Import Priority: |
| | |
| | if Qt has been imported anywhere else: |
| | use that |
| | |
| | if matplotlib has been imported and doesn't support v2 (<= 1.0.1): |
| | use PyQt4 @v1 |
| | |
| | Next, ask QT_API env variable |
| | |
| | if QT_API not set: |
| | ask matplotlib what it's using. If Qt4Agg or Qt5Agg, then use the |
| | version matplotlib is configured with |
| | |
| | else: (matplotlib said nothing) |
| | # this is the default path - nobody told us anything |
| | try in this order: |
| | PyQt default version, PySide, PyQt5 |
| | else: |
| | use what QT_API says |
| | |
| | Note that %gui's implementation will always set a `QT_API`, see |
| | `IPython.terminal.pt_inputhooks.get_inputhook_name_and_func` |
| | |
| | """ |
| | |
| | |
| | |
| |
|
| | import os |
| | import sys |
| |
|
| | from IPython.external.qt_loaders import ( |
| | load_qt, |
| | loaded_api, |
| | enum_factory, |
| | |
| | QT_API_PYQT6, |
| | QT_API_PYSIDE6, |
| | |
| | QT_API_PYQT5, |
| | QT_API_PYSIDE2, |
| | |
| | QT_API_PYQT, |
| | QT_API_PYSIDE, |
| | |
| | QT_API_PYQT_DEFAULT, |
| | ) |
| |
|
| | _qt_apis = ( |
| | |
| | QT_API_PYQT6, |
| | QT_API_PYSIDE6, |
| | |
| | QT_API_PYQT5, |
| | QT_API_PYSIDE2, |
| | |
| | QT_API_PYQT_DEFAULT, |
| | ) |
| |
|
| |
|
| | def matplotlib_options(mpl): |
| | """Constraints placed on an imported matplotlib.""" |
| | if mpl is None: |
| | return |
| | backend = mpl.rcParams.get('backend', None) |
| | if backend == 'Qt4Agg': |
| | mpqt = mpl.rcParams.get('backend.qt4', None) |
| | if mpqt is None: |
| | return None |
| | if mpqt.lower() == 'pyside': |
| | return [QT_API_PYSIDE] |
| | elif mpqt.lower() == 'pyqt4': |
| | return [QT_API_PYQT_DEFAULT] |
| | elif mpqt.lower() == 'pyqt4v2': |
| | return [QT_API_PYQT] |
| | raise ImportError("unhandled value for backend.qt4 from matplotlib: %r" % |
| | mpqt) |
| | elif backend == 'Qt5Agg': |
| | mpqt = mpl.rcParams.get('backend.qt5', None) |
| | if mpqt is None: |
| | return None |
| | if mpqt.lower() == 'pyqt5': |
| | return [QT_API_PYQT5] |
| | raise ImportError("unhandled value for backend.qt5 from matplotlib: %r" % |
| | mpqt) |
| |
|
| | def get_options(): |
| | """Return a list of acceptable QT APIs, in decreasing order of preference.""" |
| | |
| | loaded = loaded_api() |
| | if loaded is not None: |
| | return [loaded] |
| |
|
| | mpl = sys.modules.get("matplotlib", None) |
| |
|
| | if mpl is not None and tuple(mpl.__version__.split(".")) < ("1", "0", "2"): |
| | |
| | return [QT_API_PYQT_DEFAULT] |
| |
|
| | qt_api = os.environ.get('QT_API', None) |
| | if qt_api is None: |
| | |
| | return matplotlib_options(mpl) or [ |
| | QT_API_PYQT_DEFAULT, |
| | QT_API_PYQT6, |
| | QT_API_PYSIDE6, |
| | QT_API_PYQT5, |
| | QT_API_PYSIDE2, |
| | ] |
| | elif qt_api not in _qt_apis: |
| | raise RuntimeError("Invalid Qt API %r, valid values are: %r" % |
| | (qt_api, ', '.join(_qt_apis))) |
| | else: |
| | return [qt_api] |
| |
|
| |
|
| | api_opts = get_options() |
| | QtCore, QtGui, QtSvg, QT_API = load_qt(api_opts) |
| | enum_helper = enum_factory(QT_API, QtCore) |
| |
|