qt_for_kernel.py
91 lines
| 2.8 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 | |||
Min RK
|
r21823 | 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 | |||
Min RK
|
r21823 | Next, ask QT_API env variable | ||
MinRK
|
r4192 | |||
if QT_API not set: | ||||
ask matplotlib via rcParams['backend.qt4'] | ||||
if it said PyQt: | ||||
use PyQt4 @v1 | ||||
elif it said PySide: | ||||
use PySide | ||||
MinRK
|
r4191 | |||
MinRK
|
r4192 | else: (matplotlib said nothing) | ||
# this is the default path - nobody told us anything | ||||
MinRK
|
r4191 | try: | ||
PyQt @v1 | ||||
except: | ||||
fallback on PySide | ||||
MinRK
|
r4192 | else: | ||
Min RK
|
r21823 | use what QT_API says | ||
MinRK
|
r4192 | |||
epatters
|
r4149 | """ | ||
Min RK
|
r21823 | # 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 | ||
MinRK
|
r9317 | from IPython.utils.version import check_version | ||
Min RK
|
r21823 | from IPython.external.qt_loaders import (load_qt, loaded_api, QT_API_PYSIDE, | ||
QT_API_PYQT, QT_API_PYQT5, | ||||
QT_API_PYQTv1, QT_API_PYQT_DEFAULT) | ||||
_qt_apis = (QT_API_PYSIDE, QT_API_PYQT, QT_API_PYQT5, QT_API_PYQTv1, | ||||
QT_API_PYQT_DEFAULT) | ||||
MinRK
|
r4259 | |||
Chris Beaumont
|
r9722 | #Constraints placed on an imported matplotlib | ||
Min RK
|
r21823 | # TODO: Make sure this logic is still in sync with matplotlib's requirements. | ||
# In particular, matplotlib can also now support a qt5 backend, and so this will | ||||
# break if matplotlib is imported and running happily with qt5, because | ||||
# it only queries for the preferred qt4 option. | ||||
Chris Beaumont
|
r9722 | def matplotlib_options(mpl): | ||
if mpl is None: | ||||
return | ||||
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': | ||||
Chris Beaumont
|
r9815 | return [QT_API_PYQT_DEFAULT] | ||
Chris Beaumont
|
r9722 | raise ImportError("unhandled value for backend.qt4 from matplotlib: %r" % | ||
mpqt) | ||||
def get_options(): | ||||
"""Return a list of acceptable QT APIs, in decreasing order of | ||||
preference | ||||
""" | ||||
#already imported Qt somewhere. Use that | ||||
loaded = loaded_api() | ||||
if loaded is not None: | ||||
return [loaded] | ||||
mpl = sys.modules.get('matplotlib', None) | ||||
Chris Beaumont
|
r9815 | if mpl is not None and not check_version(mpl.__version__, '1.0.2'): | ||
Chris Beaumont
|
r9722 | #1.0.1 only supports PyQt4 v1 | ||
Chris Beaumont
|
r9815 | return [QT_API_PYQT_DEFAULT] | ||
Chris Beaumont
|
r9722 | |||
Min RK
|
r21823 | qt_api = os.environ.get('QT_API', None) | ||
if qt_api is None: | ||||
Chris Beaumont
|
r9722 | #no ETS variable. Ask mpl, then use either | ||
Chris Beaumont
|
r9815 | return matplotlib_options(mpl) or [QT_API_PYQT_DEFAULT, QT_API_PYSIDE] | ||
Min RK
|
r21823 | 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] | ||||
Chris Beaumont
|
r9722 | |||
api_opts = get_options() | ||||
Min RK
|
r21823 | QtCore, QtGui, QtSvg, QT_API = load_qt(api_opts) | ||