class QIPythonWidget_embed(QWidget): def __init__(self, parent=None, custom_banner=None, **kwargs): super(QIPythonWidget_embed, self).__init__(parent=parent, **kwargs) self.plugin = parent kernel_manager = QtKernelManager(kernel_name=USE_KERNEL) kernel_manager.start_kernel() kernel_client = kernel_manager.client() kernel_client.start_channels() self.jupyter_widget = RichJupyterWidget() self.jupyter_widget.kernel_manager = kernel_manager self.jupyter_widget.kernel_client = kernel_client if custom_banner is not None: self.jupyter_widget.banner = custom_banner layout = QHBoxLayout() layout.addWidget(self.jupyter_widget) def push_variables(self, variableDict): """ Given a dictionary containing name / value pairs, push those variables to the IPython console widget """ self.jupyter_widget.kernel_manager.kernel.shell.push(variableDict) def clear_terminal(self): """ Clears the terminal """ self.jupyter_widget._control.clear() def print_text(self, text): """ Prints some plain text to the console """ self.jupyter_widget._append_plain_text(text, True) def execute_command(self, command): """ Execute a command in the frame of the console widget """ self.jupyter_widget._execute(command, False)
class ipython_console(base_console, QtWidgets.QWidget): """ desc: An IPython-based debug window. """ def __init__(self, main_window): """ desc: Constructor. arguments: main_window: The main window object. """ super(ipython_console, self).__init__(main_window) kernel_manager = QtInProcessKernelManager() kernel_manager.start_kernel() self.kernel = kernel_manager.kernel self.kernel.gui = 'qt4' self.kernel.shell.banner1 = '' kernel_client = kernel_manager.client() kernel_client.start_channels() self.control = RichIPythonWidget() self.control.banner = self.banner() self.control.kernel_manager = kernel_manager self.control.kernel_client = kernel_client self.verticalLayout = QtWidgets.QVBoxLayout(self) self.verticalLayout.setContentsMargins(0,0,0,0) self.setLayout(self.verticalLayout) self.verticalLayout.addWidget(self.control) def clear(self): """See base_console.""" self.control.reset(clear=True) def focus(self): """See base_console.""" self.control._control.setFocus() def reset(self): """See base_console.""" self.kernel.shell.reset() self.kernel.shell.push(self.default_globals()) self.clear() super(ipython_console, self).reset() def show_prompt(self): """See base_console.""" self.control._show_interpreter_prompt() def get_workspace_globals(self): """See base_console.""" return self.kernel.shell.user_global_ns.copy() def set_workspace_globals(self, _globals={}): """See base_console.""" self.kernel.shell.push(_globals) def validTheme(self, cs): """ returns: desc: True if the colorscheme is valid, False otherwise. type: bool """ for key in [ u'Background', u'Default', u'Prompt in', u'Prompt out', u'Comment', u'Keyword', u'Identifier', u'Double-quoted string', u'Invalid', u'Number', u'Operator', ]: if key not in cs: return False return True def setTheme(self): """ desc: Sets the theme, based on the QProgEdit settings. """ from QProgEdit import QColorScheme if not hasattr(QColorScheme, cfg.qProgEditColorScheme): debug.msg(u'Failed to set debug-output colorscheme') return u'' cs = getattr(QColorScheme, cfg.qProgEditColorScheme) if not self.validTheme(cs): debug.msg(u'Invalid debug-output colorscheme') return u'' self.control._highlighter.set_style(pygments_style_factory(cs)) qss = u'''QPlainTextEdit, QTextEdit { background-color: %(Background)s; color: %(Default)s; } .in-prompt { color: %(Prompt in)s; } .in-prompt-number { font-weight: bold; } .out-prompt { color: %(Prompt out)s; } .out-prompt-number { font-weight: bold; } ''' % cs self.control.style_sheet = qss self.control._control.setFont(QtGui.QFont(cfg.qProgEditFontFamily, cfg.qProgEditFontSize)) def setup(self, main_window): """See base_subcomponent.""" super(ipython_console, self).setup(main_window) self.kernel.shell.push(self.default_globals()) def write(self, s): """See base_console.""" self.control._append_plain_text(str(s)) self.control._control.ensureCursorVisible() def execute(self, s): """See base_console.""" self.main_window.ui.dock_stdout.setVisible(True) self.control.execute(s) def focusInEvent(self, e): self.control.setFocus() e.accept()
class ipython_console(base_console, QtWidgets.QWidget): """ desc: An IPython-based debug window. """ def __init__(self, main_window): """ desc: Constructor. arguments: main_window: The main window object. """ super(ipython_console, self).__init__(main_window) kernel_manager = QtInProcessKernelManager() kernel_manager.start_kernel() self.kernel = kernel_manager.kernel self.kernel.gui = 'qt4' self.kernel.shell.banner1 = '' kernel_client = kernel_manager.client() kernel_client.start_channels() self.control = RichIPythonWidget() self.control.banner = self.banner() self.control.kernel_manager = kernel_manager self.control.kernel_client = kernel_client self.verticalLayout = QtWidgets.QVBoxLayout(self) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.setLayout(self.verticalLayout) self.verticalLayout.addWidget(self.control) def clear(self): """See base_console.""" self.control.reset(clear=True) def focus(self): """See base_console.""" self.control._control.setFocus() def reset(self): """See base_console.""" self.kernel.shell.reset() self.kernel.shell.push(self.default_globals()) self.clear() super(ipython_console, self).reset() def show_prompt(self): """See base_console.""" self.control._show_interpreter_prompt() def get_workspace_globals(self): """See base_console.""" return self.kernel.shell.user_global_ns.copy() def set_workspace_globals(self, _globals={}): """See base_console.""" self.kernel.shell.push(_globals) def validTheme(self, cs): """ returns: desc: True if the colorscheme is valid, False otherwise. type: bool """ for key in [ u'Background', u'Default', u'Prompt in', u'Prompt out', u'Comment', u'Keyword', u'Identifier', u'Double-quoted string', u'Invalid', u'Number', u'Operator', ]: if key not in cs: return False return True def setTheme(self): """ desc: Sets the theme, based on the QProgEdit settings. """ from QProgEdit import QColorScheme if not hasattr(QColorScheme, cfg.qProgEditColorScheme): debug.msg(u'Failed to set debug-output colorscheme') return u'' cs = getattr(QColorScheme, cfg.qProgEditColorScheme) if not self.validTheme(cs): debug.msg(u'Invalid debug-output colorscheme') return u'' self.control._highlighter.set_style(pygments_style_factory(cs)) qss = u'''QPlainTextEdit, QTextEdit { background-color: %(Background)s; color: %(Default)s; } .in-prompt { color: %(Prompt in)s; } .in-prompt-number { font-weight: bold; } .out-prompt { color: %(Prompt out)s; } .out-prompt-number { font-weight: bold; } ''' % cs self.control.style_sheet = qss self.control._control.setFont( QtGui.QFont(cfg.qProgEditFontFamily, cfg.qProgEditFontSize)) def setup(self, main_window): """See base_subcomponent.""" super(ipython_console, self).setup(main_window) self.kernel.shell.push(self.default_globals()) def write(self, s): """See base_console.""" self.control._append_plain_text(str(s)) def execute(self, s): """See base_console.""" self.main_window.ui.dock_stdout.setVisible(True) self.control.execute(s) def focusInEvent(self, e): self.control.setFocus() e.accept()
class IPythonDock(Dock): def __init__(self, *args, **kwargs): super(IPythonDock, self).__init__(*args, **kwargs) self.setMinimumHeight(25) self.setMinimumWidth(500) self.setWindowTitle("IPython Shell") self.setAllowedAreas(QtCore.Qt.AllDockWidgetAreas) self.console = RichJupyterWidget(name="console") self.console.font_size = 7 self.setWidget(self.console) def setup_ipython(self, main_window): """ Sets up the ipython shell for the relevant docks. :return: """ self.console.kernel_manager = kernel_manager = \ QtInProcessKernelManager() kernel_manager.start_kernel(show_banner=True) kernel_manager.kernel.gui = 'qt' self.console.kernel_client = kernel_client = kernel_manager.client() kernel_client.start_channels() def stop(): kernel_client.stop_channels() kernel_manager.shutdown_kernel() self.console.exit_requested.connect(stop) self.push_vars({"KatilInstance": main_window}) self.console.show() self.inject_globals() self.inject_debugs() def push_vars(self, variableDict): """ Given a dictionary containing name / value pairs, push those variables to the Jupyter console widget """ self.console.kernel_manager.kernel.shell.push(variableDict) def pull_var(self, varName, delete=False): v = self.console.kernel_manager.kernel.shell.user_ns[varName] if delete: del self.console.kernel_manager.kernel.shell.user_ns[varName] return v def delete_var(self, varName): del self.console.kernel_manager.kernel.shell.user_ns[varName] def clear(self): """ Clears the terminal """ self.console._control.clear() # self.kernel_manager def print_text(self, text): """ Prints some plain text to the console """ self.console._append_plain_text(text) def execute_command(self, command): """ Execute a command in the frame of the console widget """ self.console._execute(command, False) def inject_globals(self, glbls=None): """ Inject the globals() dict into the IPython kernel under the key '_injected' :return: """ if glbls is None: glbls = globals() self.push_vars({"_injected": glbls}) self.execute_command("from PyQt5.QtWidgets import *") self.execute_command("from praatkatili import *") def inject_debugs(self): self.push_vars({'canvas': self.findChildren(PlotCanvas)})