1
0
mirror of https://github.com/bec-project/bec_widgets.git synced 2026-03-06 17:02:50 +01:00

fix(jupyter_console): cleanup

This commit is contained in:
2025-10-17 13:40:42 +02:00
committed by Jan Wyzula
parent 6b5aa74934
commit 16d88fe8df

View File

@@ -2,6 +2,7 @@ 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.QtCore import Qt
from qtpy.QtWidgets import QApplication, QMainWindow
@@ -9,10 +10,10 @@ class BECJupyterConsole(RichJupyterWidget): # pragma: no cover:
def __init__(self, inprocess: bool = False):
super().__init__()
self.inprocess = None
self.client = None
self.inprocess = inprocess
self.ipyclient = None
self.kernel_manager, self.kernel_client = self._init_kernel(inprocess=inprocess)
self.kernel_manager, self.kernel_client = self._init_kernel(inprocess=self.inprocess)
self.set_default_style("linux")
self._init_bec()
@@ -35,14 +36,13 @@ class BECJupyterConsole(RichJupyterWidget): # pragma: no cover:
self._init_bec_kernel()
def _init_bec_inprocess(self):
self.client = BECIPythonClient()
self.client.start()
self.ipyclient = BECIPythonClient()
self.ipyclient.start()
self.kernel_manager.kernel.shell.push(
{
"bec": self.client,
"dev": self.client.device_manager.devices,
"scans": self.client.scans,
"bec": self.ipyclient,
"dev": self.ipyclient.device_manager.devices,
"scans": self.ipyclient.scans,
}
)
@@ -57,20 +57,47 @@ class BECJupyterConsole(RichJupyterWidget): # pragma: no cover:
"""
)
def _cleanup_bec(self):
if getattr(self, "ipyclient", None) is not None and self.inprocess is True:
self.ipyclient.shutdown()
self.ipyclient = None
def shutdown_kernel(self):
"""
Shutdown the Jupyter kernel and clean up resources.
"""
self._cleanup_bec()
self.kernel_client.stop_channels()
self.kernel_manager.shutdown_kernel()
self.kernel_client = None
self.kernel_manager = None
def closeEvent(self, event):
self.shutdown_kernel()
event.accept()
super().closeEvent(event)
class JupyterConsoleWindow(QMainWindow): # pragma: no cover:
def __init__(self, inprocess: bool = True, parent=None):
super().__init__(parent)
self.console = BECJupyterConsole(inprocess=inprocess)
self.setCentralWidget(self.console)
self.setAttribute(Qt.WA_DeleteOnClose, True)
def closeEvent(self, event):
# Explicitly close the console so its own closeEvent runs
if getattr(self, "console", None) is not None:
self.console.close()
event.accept()
super().closeEvent(event)
if __name__ == "__main__": # pragma: no cover
import sys
app = QApplication(sys.argv)
win = QMainWindow()
win.setCentralWidget(BECJupyterConsole(True))
win = JupyterConsoleWindow(inprocess=True)
win.show()
sys.exit(app.exec_())