Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/IPython/terminal/pt_inputhooks/__init__.py: 17%
65 statements
« prev ^ index » next coverage.py v7.4.4, created at 2024-04-20 06:09 +0000
« prev ^ index » next coverage.py v7.4.4, created at 2024-04-20 06:09 +0000
1import importlib
2import os
4aliases = {
5 'qt4': 'qt',
6 'gtk2': 'gtk',
7}
9backends = [
10 "qt",
11 "qt5",
12 "qt6",
13 "gtk",
14 "gtk2",
15 "gtk3",
16 "gtk4",
17 "tk",
18 "wx",
19 "pyglet",
20 "glut",
21 "osx",
22 "asyncio",
23]
25registered = {}
27def register(name, inputhook):
28 """Register the function *inputhook* as an event loop integration."""
29 registered[name] = inputhook
32class UnknownBackend(KeyError):
33 def __init__(self, name):
34 self.name = name
36 def __str__(self):
37 return ("No event loop integration for {!r}. "
38 "Supported event loops are: {}").format(self.name,
39 ', '.join(backends + sorted(registered)))
42def set_qt_api(gui):
43 """Sets the `QT_API` environment variable if it isn't already set."""
45 qt_api = os.environ.get("QT_API", None)
47 from IPython.external.qt_loaders import (
48 QT_API_PYQT,
49 QT_API_PYQT5,
50 QT_API_PYQT6,
51 QT_API_PYSIDE,
52 QT_API_PYSIDE2,
53 QT_API_PYSIDE6,
54 QT_API_PYQTv1,
55 loaded_api,
56 )
58 loaded = loaded_api()
60 qt_env2gui = {
61 QT_API_PYSIDE: "qt4",
62 QT_API_PYQTv1: "qt4",
63 QT_API_PYQT: "qt4",
64 QT_API_PYSIDE2: "qt5",
65 QT_API_PYQT5: "qt5",
66 QT_API_PYSIDE6: "qt6",
67 QT_API_PYQT6: "qt6",
68 }
69 if loaded is not None and gui != "qt":
70 if qt_env2gui[loaded] != gui:
71 print(
72 f"Cannot switch Qt versions for this session; will use {qt_env2gui[loaded]}."
73 )
74 return qt_env2gui[loaded]
76 if qt_api is not None and gui != "qt":
77 if qt_env2gui[qt_api] != gui:
78 print(
79 f'Request for "{gui}" will be ignored because `QT_API` '
80 f'environment variable is set to "{qt_api}"'
81 )
82 return qt_env2gui[qt_api]
83 else:
84 if gui == "qt5":
85 try:
86 import PyQt5 # noqa
88 os.environ["QT_API"] = "pyqt5"
89 except ImportError:
90 try:
91 import PySide2 # noqa
93 os.environ["QT_API"] = "pyside2"
94 except ImportError:
95 os.environ["QT_API"] = "pyqt5"
96 elif gui == "qt6":
97 try:
98 import PyQt6 # noqa
100 os.environ["QT_API"] = "pyqt6"
101 except ImportError:
102 try:
103 import PySide6 # noqa
105 os.environ["QT_API"] = "pyside6"
106 except ImportError:
107 os.environ["QT_API"] = "pyqt6"
108 elif gui == "qt":
109 # Don't set QT_API; let IPython logic choose the version.
110 if "QT_API" in os.environ.keys():
111 del os.environ["QT_API"]
112 else:
113 print(f'Unrecognized Qt version: {gui}. Should be "qt5", "qt6", or "qt".')
114 return
116 # Import it now so we can figure out which version it is.
117 from IPython.external.qt_for_kernel import QT_API
119 return qt_env2gui[QT_API]
122def get_inputhook_name_and_func(gui):
123 if gui in registered:
124 return gui, registered[gui]
126 if gui not in backends:
127 raise UnknownBackend(gui)
129 if gui in aliases:
130 return get_inputhook_name_and_func(aliases[gui])
132 gui_mod = gui
133 if gui.startswith("qt"):
134 gui = set_qt_api(gui)
135 gui_mod = "qt"
137 mod = importlib.import_module("IPython.terminal.pt_inputhooks." + gui_mod)
138 return gui, mod.inputhook