From 8c03034acf6b3ed1e346ebf1b785d41068513cc5 Mon Sep 17 00:00:00 2001 From: wyzula-jan Date: Fri, 24 May 2024 20:18:51 +0200 Subject: [PATCH] feat(widgets/console): BECJupyterConsole added --- .../jupyter_console/jupyter_console_window.py | 73 +++++++++---------- .../widgets/jupyter_console/__init__.py | 0 .../jupyter_console/jupyter_console.py | 72 ++++++++++++++++++ 3 files changed, 108 insertions(+), 37 deletions(-) create mode 100644 bec_widgets/widgets/jupyter_console/__init__.py create mode 100644 bec_widgets/widgets/jupyter_console/jupyter_console.py diff --git a/bec_widgets/examples/jupyter_console/jupyter_console_window.py b/bec_widgets/examples/jupyter_console/jupyter_console_window.py index a2585409..c1d271c2 100644 --- a/bec_widgets/examples/jupyter_console/jupyter_console_window.py +++ b/bec_widgets/examples/jupyter_console/jupyter_console_window.py @@ -12,22 +12,22 @@ from qtpy.QtWidgets import QApplication, QVBoxLayout, QWidget from bec_widgets.utils import BECDispatcher, UILoader from bec_widgets.widgets import BECFigure from bec_widgets.widgets.dock.dock_area import BECDockArea +from bec_widgets.widgets.jupyter_console.jupyter_console import BECJupyterConsole - -class JupyterConsoleWidget(RichJupyterWidget): # pragma: no cover: - def __init__(self): - super().__init__() - - self.kernel_manager = QtInProcessKernelManager() - self.kernel_manager.start_kernel(show_banner=False) - self.kernel_client = self.kernel_manager.client() - self.kernel_client.start_channels() - - self.kernel_manager.kernel.shell.push({"np": np, "pg": pg}) - - def shutdown_kernel(self): - self.kernel_client.stop_channels() - self.kernel_manager.shutdown_kernel() +# class JupyterConsoleWidget(RichJupyterWidget): # pragma: no cover: +# def __init__(self): +# super().__init__() +# +# self.kernel_manager = QtInProcessKernelManager() +# self.kernel_manager.start_kernel(show_banner=False) +# self.kernel_client = self.kernel_manager.client() +# self.kernel_client.start_channels() +# +# self.kernel_manager.kernel.shell.push({"np": np, "pg": pg}) +# +# def shutdown_kernel(self): +# self.kernel_client.stop_channels() +# self.kernel_manager.shutdown_kernel() class JupyterConsoleWindow(QWidget): # pragma: no cover: @@ -45,25 +45,25 @@ class JupyterConsoleWindow(QWidget): # pragma: no cover: self.safe_close = False # console push - self.console.kernel_manager.kernel.shell.push( - { - "fig": self.figure, - "dock": self.dock, - "w1": self.w1, - "w2": self.w2, - "w3": self.w3, - "d0": self.d0, - "d1": self.d1, - "d2": self.d2, - "fig0": self.fig0, - "fig1": self.fig1, - "fig2": self.fig2, - "bar": self.bar, - "bec": self.figure.client, - "scans": self.figure.client.scans, - "dev": self.figure.client.device_manager.devices, - } - ) + if self.console.inprocess is True: + self.console.kernel_manager.kernel.shell.push( + { + "np": np, + "pg": pg, + "fig": self.figure, + "dock": self.dock, + "w1": self.w1, + "w2": self.w2, + "w3": self.w3, + "d0": self.d0, + "d1": self.d1, + "d2": self.d2, + "fig0": self.fig0, + "fig1": self.fig1, + "fig2": self.fig2, + "bar": self.bar, + } + ) def _init_ui(self): # Plotting window @@ -82,9 +82,8 @@ class JupyterConsoleWindow(QWidget): # pragma: no cover: self._init_dock() self.console_layout = QVBoxLayout(self.ui.widget_console) - self.console = JupyterConsoleWidget() + self.console = BECJupyterConsole(inprocess=True) self.console_layout.addWidget(self.console) - self.console.set_default_style("linux") def _init_figure(self): self.figure.plot(x_name="samx", y_name="bpm4d") @@ -144,7 +143,7 @@ if __name__ == "__main__": # pragma: no cover app = QApplication(sys.argv) app.setApplicationName("Jupyter Console") app.setApplicationDisplayName("Jupyter Console") - qdarktheme.setup_theme("auto") + # qdarktheme.setup_theme("auto") icon = QIcon() icon.addFile(os.path.join(module_path, "assets", "terminal_icon.png"), size=QSize(48, 48)) app.setWindowIcon(icon) diff --git a/bec_widgets/widgets/jupyter_console/__init__.py b/bec_widgets/widgets/jupyter_console/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/bec_widgets/widgets/jupyter_console/jupyter_console.py b/bec_widgets/widgets/jupyter_console/jupyter_console.py new file mode 100644 index 00000000..b9c2e8e8 --- /dev/null +++ b/bec_widgets/widgets/jupyter_console/jupyter_console.py @@ -0,0 +1,72 @@ +from bec_ipython_client.main import BECIPythonClient +from qtconsole.inprocess import QtInProcessKernelManager +from qtconsole.manager import QtKernelManager +from qtconsole.rich_jupyter_widget import RichJupyterWidget +from qtpy.QtWidgets import QApplication, QMainWindow + + +class BECJupyterConsole(RichJupyterWidget): # pragma: no cover: + def __init__(self, inprocess: bool = False): + super().__init__() + + self.inprocess = None + + self.kernel_manager, self.kernel_client = self._init_kernel(inprocess=inprocess) + self.set_default_style("linux") + self._init_bec() + + def _init_kernel(self, inprocess: bool = False, kernel_name: str = "python3"): + self.inprocess = inprocess + if inprocess is True: + print("starting inprocess kernel") + kernel_manager = QtInProcessKernelManager() + else: + kernel_manager = QtKernelManager(kernel_name=kernel_name) + kernel_manager.start_kernel() + kernel_client = kernel_manager.client() + kernel_client.start_channels() + return kernel_manager, kernel_client + + def _init_bec(self): + if self.inprocess is True: + self._init_bec_inprocess() + else: + self._init_bec_kernel() + + def _init_bec_inprocess(self): + self.client = BECIPythonClient() + self.client.start() + + self.kernel_manager.kernel.shell.push( + { + "bec": self.client, + "dev": self.client.device_manager.devices, + "scans": self.client.scans, + } + ) + + def _init_bec_kernel(self): + self.execute( + """ + from bec_ipython_client.main import BECIPythonClient + bec = BECIPythonClient() + bec.start() + dev = bec.device_manager.devices if bec else None + scans = bec.scans if bec else None + """ + ) + + def shutdown_kernel(self): + self.kernel_client.stop_channels() + self.kernel_manager.shutdown_kernel() + + +if __name__ == "__main__": # pragma: no cover + import sys + + app = QApplication(sys.argv) + win = QMainWindow() + win.setCentralWidget(BECJupyterConsole(True)) + win.show() + + sys.exit(app.exec_())