qt_for_kernel.py
124 lines
| 3.4 KiB
| text/x-python
|
PythonLexer
epatters
|
r4149 | """ Import Qt in a manner suitable for an IPython kernel. | ||
MinRK
|
r4191 | |||
Matthias BUSSONNIER
|
r11783 | This is the import used for the `gui=qt` or `matplotlib=qt` initialization. | ||
MinRK
|
r4191 | |||
MinRK
|
r4192 | Import Priority: | ||
MinRK
|
r4191 | |||
Zachary Pincus
|
r21675 | if Qt has been imported anywhere else: | ||
Chris Beaumont
|
r9722 | use that | ||
MinRK
|
r4192 | if matplotlib has been imported and doesn't support v2 (<= 1.0.1): | ||
use PyQt4 @v1 | ||||
MinRK
|
r4191 | |||
Zachary Pincus
|
r21675 | Next, ask QT_API env variable | ||
MinRK
|
r4192 | |||
if QT_API not set: | ||||
Zachary Pincus
|
r21679 | ask matplotlib what it's using. If Qt4Agg or Qt5Agg, then use the | ||
version matplotlib is configured with | ||||
MinRK
|
r4191 | |||
MinRK
|
r4192 | else: (matplotlib said nothing) | ||
# this is the default path - nobody told us anything | ||||
Zachary Pincus
|
r21679 | try in this order: | ||
Zachary Pincus
|
r21680 | PyQt default version, PySide, PyQt5 | ||
MinRK
|
r4192 | else: | ||
Zachary Pincus
|
r21675 | use what QT_API says | ||
MinRK
|
r4192 | |||
Emilio Graff
|
r27986 | Note that %gui's implementation will always set a `QT_API`, see | ||
`IPython.terminal.pt_inputhooks.get_inputhook_name_and_func` | ||||
epatters
|
r4149 | """ | ||
Zachary Pincus
|
r21675 | # NOTE: This is no longer an external, third-party module, and should be | ||
# considered part of IPython. For compatibility however, it is being kept in | ||||
# IPython/external. | ||||
epatters
|
r4149 | |||
MinRK
|
r4191 | import os | ||
epatters
|
r4149 | import sys | ||
Thomas A Caswell
|
r26683 | from IPython.external.qt_loaders import ( | ||
Thomas A Caswell
|
r26684 | load_qt, | ||
loaded_api, | ||||
enum_factory, | ||||
Thomas A Caswell
|
r26683 | # QT6 | ||
Thomas A Caswell
|
r26684 | QT_API_PYQT6, | ||
QT_API_PYSIDE6, | ||||
Thomas A Caswell
|
r26683 | # QT5 | ||
Thomas A Caswell
|
r26684 | QT_API_PYQT5, | ||
QT_API_PYSIDE2, | ||||
Thomas A Caswell
|
r26683 | # QT4 | ||
Thomas A Caswell
|
r26684 | QT_API_PYQT, | ||
QT_API_PYSIDE, | ||||
Thomas A Caswell
|
r26683 | # default | ||
Thomas A Caswell
|
r26684 | QT_API_PYQT_DEFAULT, | ||
Thomas A Caswell
|
r26683 | ) | ||
_qt_apis = ( | ||||
# QT6 | ||||
Thomas A Caswell
|
r26684 | QT_API_PYQT6, | ||
QT_API_PYSIDE6, | ||||
Thomas A Caswell
|
r26683 | # QT5 | ||
Thomas A Caswell
|
r26684 | QT_API_PYQT5, | ||
QT_API_PYSIDE2, | ||||
Thomas A Caswell
|
r26683 | # default | ||
Thomas A Caswell
|
r26684 | QT_API_PYQT_DEFAULT, | ||
Thomas A Caswell
|
r26683 | ) | ||
Zachary Pincus
|
r21669 | |||
MinRK
|
r4259 | |||
Chris Beaumont
|
r9722 | def matplotlib_options(mpl): | ||
Thomas A Caswell
|
r26683 | """Constraints placed on an imported matplotlib.""" | ||
Chris Beaumont
|
r9722 | if mpl is None: | ||
return | ||||
Zachary Pincus
|
r21679 | 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] | ||||
Zachary Pincus
|
r21681 | elif mpqt.lower() == 'pyqt4v2': | ||
Zachary Pincus
|
r21679 | 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) | ||||
Chris Beaumont
|
r9722 | |||
def get_options(): | ||||
Thomas A Caswell
|
r26683 | """Return a list of acceptable QT APIs, in decreasing order of preference.""" | ||
Chris Beaumont
|
r9722 | #already imported Qt somewhere. Use that | ||
loaded = loaded_api() | ||||
if loaded is not None: | ||||
return [loaded] | ||||
Emilio Graff
|
r27994 | mpl = sys.modules.get("matplotlib", None) | ||
Chris Beaumont
|
r9722 | |||
Nikita Kniazev
|
r27086 | if mpl is not None and tuple(mpl.__version__.split(".")) < ("1", "0", "2"): | ||
# 1.0.1 only supports PyQt4 v1 | ||||
Chris Beaumont
|
r9815 | return [QT_API_PYQT_DEFAULT] | ||
Chris Beaumont
|
r9722 | |||
Zachary Pincus
|
r21669 | qt_api = os.environ.get('QT_API', None) | ||
if qt_api is None: | ||||
Zachary Pincus
|
r21679 | #no ETS variable. Ask mpl, then use default fallback path | ||
Thomas A Caswell
|
r26683 | return matplotlib_options(mpl) or [ | ||
QT_API_PYQT_DEFAULT, | ||||
QT_API_PYQT6, | ||||
QT_API_PYSIDE6, | ||||
QT_API_PYQT5, | ||||
QT_API_PYSIDE2, | ||||
] | ||||
Zachary Pincus
|
r21669 | elif qt_api not in _qt_apis: | ||
raise RuntimeError("Invalid Qt API %r, valid values are: %r" % | ||||
Zachary Pincus
|
r21671 | (qt_api, ', '.join(_qt_apis))) | ||
Zachary Pincus
|
r21669 | else: | ||
return [qt_api] | ||||
Chris Beaumont
|
r9722 | |||
Thomas A Caswell
|
r26683 | |||
Chris Beaumont
|
r9722 | api_opts = get_options() | ||
Zachary Pincus
|
r21669 | QtCore, QtGui, QtSvg, QT_API = load_qt(api_opts) | ||
Thomas A Caswell
|
r26683 | enum_helper = enum_factory(QT_API, QtCore) | ||