|
|
""" Defines a KernelClient that provides signals and slots.
|
|
|
"""
|
|
|
|
|
|
from IPython.external.qt import QtCore
|
|
|
|
|
|
# Local imports
|
|
|
from IPython.utils.traitlets import Bool, DottedObjectName
|
|
|
|
|
|
from IPython.kernel import KernelManager
|
|
|
from IPython.kernel.restarter import KernelRestarter
|
|
|
|
|
|
from .kernel_mixins import QtKernelManagerMixin, QtKernelRestarterMixin
|
|
|
|
|
|
|
|
|
class QtKernelRestarter(KernelRestarter, QtKernelRestarterMixin):
|
|
|
|
|
|
def start(self):
|
|
|
if self._timer is None:
|
|
|
self._timer = QtCore.QTimer()
|
|
|
self._timer.timeout.connect(self.poll)
|
|
|
self._timer.start(self.time_to_dead * 1000)
|
|
|
|
|
|
def stop(self):
|
|
|
self._timer.stop()
|
|
|
|
|
|
def poll(self):
|
|
|
super(QtKernelRestarter, self).poll()
|
|
|
|
|
|
|
|
|
class QtKernelManager(KernelManager, QtKernelManagerMixin):
|
|
|
"""A KernelManager with Qt signals for restart"""
|
|
|
|
|
|
client_class = DottedObjectName('IPython.qt.client.QtKernelClient')
|
|
|
autorestart = Bool(True, config=True)
|
|
|
|
|
|
def start_restarter(self):
|
|
|
if self.autorestart and self.has_kernel:
|
|
|
if self._restarter is None:
|
|
|
self._restarter = QtKernelRestarter(
|
|
|
kernel_manager=self,
|
|
|
parent=self,
|
|
|
log=self.log,
|
|
|
)
|
|
|
self._restarter.add_callback(self._handle_kernel_restarted)
|
|
|
self._restarter.start()
|
|
|
|
|
|
def stop_restarter(self):
|
|
|
if self.autorestart:
|
|
|
if self._restarter is not None:
|
|
|
self._restarter.stop()
|
|
|
|
|
|
def _handle_kernel_restarted(self):
|
|
|
self.kernel_restarted.emit()
|
|
|
|