File: qt_for_kernel.py

package info (click to toggle)
pydevd 3.4.1%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 13,892 kB
  • sloc: python: 77,580; cpp: 1,873; sh: 374; makefile: 50; ansic: 4
file content (135 lines) | stat: -rw-r--r-- 3,954 bytes parent folder | download | duplicates (2)
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