1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
"""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 Qt4 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 ETS' QT_API env variable
if QT_API not set:
ask matplotlib via rcParams['backend.qt4']
if it said PyQt:
use PyQt4 @v1
elif it said PySide:
use PySide
else: (matplotlib said nothing)
# this is the default path - nobody told us anything
try:
PyQt @v1
except:
fallback on PySide
else:
use PyQt @v2 or PySide, depending on QT_API
because ETS doesn't work with PyQt @v1.
"""
import os
import sys
from pydev_ipython.version import check_version
from pydev_ipython.qt_loaders import (
load_qt,
QT_API_PYSIDE,
QT_API_PYSIDE2,
QT_API_PYQT,
QT_API_PYQT_DEFAULT,
loaded_api,
QT_API_PYQT5,
QT_API_PYQT6,
)
# Constraints placed on an imported matplotlib
def matplotlib_options(mpl):
if mpl is None:
return
# #PyDev-779: In pysrc/pydev_ipython/qt_for_kernel.py, matplotlib_options should be replaced with latest from ipython
# (i.e.: properly check backend to decide upon qt4/qt5).
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)
elif backend == "Qt6Agg":
mpqt = mpl.rcParams.get("backend.qt6", None)
if mpqt is None:
return None
if mpqt.lower() == "pyqt6":
return [QT_API_PYQT6]
raise ImportError("unhandled value for backend.qt6 from matplotlib: %r" % mpqt)
# Fallback without checking backend (previous code)
mpqt = mpl.rcParams.get("backend.qt4", None)
if mpqt is None:
mpqt = mpl.rcParams.get("backend.qt5", None)
if mpqt is None:
mpqt = mpl.rcParams.get("backend.qt6", 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() == "pyqt5":
return [QT_API_PYQT5]
elif mpqt.lower() == "pyqt6":
return [QT_API_PYQT6]
raise ImportError("unhandled value for qt backend 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)
if mpl is not None and not check_version(mpl.__version__, "1.0.2"):
# 1.0.1 only supports PyQt4 v1
return [QT_API_PYQT_DEFAULT]
if os.environ.get("QT_API", None) is None:
# no ETS variable. Ask mpl, then use either
return matplotlib_options(mpl) or [QT_API_PYQT_DEFAULT, QT_API_PYSIDE, QT_API_PYSIDE2, QT_API_PYQT5, QT_API_PYQT6]
# ETS variable present. Will fallback to external.qt
return None
api_opts = get_options()
if api_opts is not None:
QtCore, QtGui, QtSvg, QT_API = load_qt(api_opts)
else: # use ETS variable
from pydev_ipython.qt import QtCore, QtGui, QtSvg, QT_API
|