##// END OF EJS Templates
PR: Add needs_local_scope to debug magic (#13960)...
PR: Add needs_local_scope to debug magic (#13960) Fixes https://github.com/ipython/ipython/issues/13959

File last commit:

r28049:37ec2adc
r28162:83f90a3f merge
Show More
__init__.py
132 lines | 3.2 KiB | text/x-python | PythonLexer
Thomas Kluyver
Write & borrow some inputhooks for prompt_toolkit
r21934 import importlib
import os
aliases = {
Thomas Kluyver
Add prompt_toolkit input hooks for wx
r21941 'qt4': 'qt',
Thomas Kluyver
Better error message for unknown input hook...
r22118 'gtk2': 'gtk',
Thomas Kluyver
Write & borrow some inputhooks for prompt_toolkit
r21934 }
Thomas Kluyver
Better error message for unknown input hook...
r22118 backends = [
Thomas A Caswell
STY: apply darker
r26684 "qt",
"qt5",
"qt6",
"gtk",
"gtk2",
"gtk3",
Elliott Sales de Andrade
Add input hooks for GTK4.
r26726 "gtk4",
Thomas A Caswell
STY: apply darker
r26684 "tk",
"wx",
"pyglet",
"glut",
"osx",
"asyncio",
Thomas Kluyver
Better error message for unknown input hook...
r22118 ]
Thomas Kluyver
Update docs and add registration interface for inputhooks
r22613 registered = {}
def register(name, inputhook):
"""Register the function *inputhook* as an event loop integration."""
registered[name] = inputhook
Thomas A Caswell
ENH: add support for Qt6 input hooks...
r26683
Thomas Kluyver
Better error message for unknown input hook...
r22118 class UnknownBackend(KeyError):
def __init__(self, name):
self.name = name
def __str__(self):
return ("No event loop integration for {!r}. "
"Supported event loops are: {}").format(self.name,
Thomas Kluyver
Update docs and add registration interface for inputhooks
r22613 ', '.join(backends + sorted(registered)))
Thomas Kluyver
Better error message for unknown input hook...
r22118
Thomas A Caswell
ENH: add support for Qt6 input hooks...
r26683
Emilio Graff
Bring in Qt import logic from `ipykernel`...
r27990 def set_qt_api(gui):
"""Sets the `QT_API` environment variable if it isn't already set."""
Emilio Graff
Use existing constants
r27998 qt_api = os.environ.get("QT_API", None)
Emilio Graff
Keep track of Qt version since it can't change
r27992
Emilio Graff
Use existing constants
r27998 from IPython.external.qt_loaders import (
QT_API_PYQT,
QT_API_PYQT5,
QT_API_PYQT6,
QT_API_PYSIDE,
QT_API_PYSIDE2,
QT_API_PYSIDE6,
QT_API_PYQTv1,
loaded_api,
)
loaded = loaded_api()
qt_env2gui = {
Emilio Graff
Formatting
r28001 QT_API_PYSIDE: "qt4",
QT_API_PYQTv1: "qt4",
QT_API_PYQT: "qt4",
QT_API_PYSIDE2: "qt5",
QT_API_PYQT5: "qt5",
QT_API_PYSIDE6: "qt6",
QT_API_PYQT6: "qt6",
Emilio Graff
Use existing constants
r27998 }
Emilio Graff
Formatting
r28001 if loaded is not None and gui != "qt":
Emilio Graff
Use existing constants
r27998 if qt_env2gui[loaded] != gui:
Emilio Graff
Address @ccordoba12's comments
r28046 print(
Emilio Graff
Formatting
r28001 f"Cannot switch Qt versions for this session; must use {qt_env2gui[loaded]}."
Emilio Graff
Keep track of Qt version since it can't change
r27992 )
Emilio Graff
Address @ccordoba12's comments
r28046 return
Emilio Graff
Bring in Qt import logic from `ipykernel`...
r27990
Emilio Graff
Formatting
r28001 if qt_api is not None and gui != "qt":
Emilio Graff
Use existing constants
r27998 if qt_env2gui[qt_api] != gui:
Emilio Graff
Bring in Qt import logic from `ipykernel`...
r27990 print(
f'Request for "{gui}" will be ignored because `QT_API` '
f'environment variable is set to "{qt_api}"'
)
else:
Emilio Graff
Remove direct support for Qt4...
r28021 if gui == "qt5":
Emilio Graff
Bring in Qt import logic from `ipykernel`...
r27990 try:
import PyQt5 # noqa
os.environ["QT_API"] = "pyqt5"
except ImportError:
try:
import PySide2 # noqa
os.environ["QT_API"] = "pyside2"
except ImportError:
os.environ["QT_API"] = "pyqt5"
elif gui == "qt6":
try:
import PyQt6 # noqa
os.environ["QT_API"] = "pyqt6"
except ImportError:
try:
import PySide6 # noqa
os.environ["QT_API"] = "pyside6"
except ImportError:
os.environ["QT_API"] = "pyqt6"
elif gui == "qt":
# Don't set QT_API; let IPython logic choose the version.
if "QT_API" in os.environ.keys():
del os.environ["QT_API"]
else:
Emilio Graff
Formatting
r28049 print(f'Unrecognized Qt version: {gui}. Should be "qt5", "qt6", or "qt".')
Emilio Graff
Address @ccordoba12's comments
r28046 return
Emilio Graff
Bring in Qt import logic from `ipykernel`...
r27990
Thomas Kluyver
Let IPython.lib.guisupport detect terminal-integrated event loops...
r22913 def get_inputhook_name_and_func(gui):
Thomas Kluyver
Update docs and add registration interface for inputhooks
r22613 if gui in registered:
Thomas Kluyver
Let IPython.lib.guisupport detect terminal-integrated event loops...
r22913 return gui, registered[gui]
Thomas Kluyver
Update docs and add registration interface for inputhooks
r22613
Thomas Kluyver
Better error message for unknown input hook...
r22118 if gui not in backends:
raise UnknownBackend(gui)
Thomas Kluyver
Write & borrow some inputhooks for prompt_toolkit
r21934 if gui in aliases:
Thomas Kluyver
Let IPython.lib.guisupport detect terminal-integrated event loops...
r22913 return get_inputhook_name_and_func(aliases[gui])
Thomas Kluyver
Write & borrow some inputhooks for prompt_toolkit
r21934
Thomas Kluyver
Let IPython.lib.guisupport detect terminal-integrated event loops...
r22913 gui_mod = gui
Emilio Graff
Bring in Qt import logic from `ipykernel`...
r27990 if gui.startswith("qt"):
set_qt_api(gui)
Thomas A Caswell
STY: apply darker
r26684 gui_mod = "qt"
Thomas Kluyver
Write & borrow some inputhooks for prompt_toolkit
r21934
Emilio Graff
Bring in Qt import logic from `ipykernel`...
r27990 mod = importlib.import_module("IPython.terminal.pt_inputhooks." + gui_mod)
Thomas Kluyver
Let IPython.lib.guisupport detect terminal-integrated event loops...
r22913 return gui, mod.inputhook