qtconsole with RichJupyterWidget hangs the GUI untill the job is finished

152 views
Skip to first unread message

Trifon Trifonov

unread,
Feb 14, 2019, 2:53:53 PM2/14/19
to Project Jupyter

I have developed a fairly complex GUI tool using the Qt Designer.


For more details about the tool see: https://github.com/3fon3fonov/trifon


The tool has an embedded jupyter shell via the qtconsole. The shell works fine and is fully responsive. Unfortunately, if I run some

heavy task on the jupyter shell, it hangs the GUI untill the job is done. In my case some calculations can take hours and in some

extreme cases even days! Any idea how to send the qtconsole to a separate thread?


I want to get a "spyder"-like qtconsole experience.


I must add that I successfully de-attach a number of heavy-lifting routines within my code using the QtCore.QThreadPool()

and a Worker Class to handle the tasks. However, every time I try to do that with the qtconsole leads to

different errors and here I am.... I need someone to open my eyes!

The ConsoleWidget_embed() class is defined as:



import sys #,os
from PyQt5 import QtWidgets, QtCore #, QtGui, uic

from qtconsole.rich_jupyter_widget import RichJupyterWidget
from qtconsole.inprocess import QtInProcessKernelManager
from qtconsole.console_widget import ConsoleWidget


class ConsoleWidget_embed(RichJupyterWidget,ConsoleWidget):
 
global fit

 
def __init__(self, customBanner=None, *args, **kwargs):
 
super(ConsoleWidget_embed, self).__init__(*args, **kwargs)

 
if customBanner is not None:
 
self.banner = customBanner

 
#self.process = QtCore.QProcess(self)

 
#self.font_size = 4
 
self.kernel_manager = QtInProcessKernelManager()
 
self.kernel_manager.start_kernel(show_banner=True)
 
self.kernel_manager.kernel.gui = 'qt'
 
self.kernel = self.kernel_manager.kernel
 
self.kernel_client = self._kernel_manager.client()
 
self.kernel_client.start_channels()

 
#self.process.start(self.kernel_client.start_channels())

 
#self._execute("kernel = %s"%fit, False)

 
def stop():
 
self.kernel_client.stop_channels()
 
self.kernel_manager.shutdown_kernel()
 
self.guisupport.get_app_qt().exit()

 
self.exit_requested.connect(stop)


 
def push_vars(self, variableDict):
 
"""
 Given a dictionary containing name / value pairs, push those variables
 to the Jupyter console widget
 """

 
self.kernel_manager.kernel.shell.push(variableDict)

 
def clear(self):
 
"""
 Clears the terminal
 """

 
self._control.clear()

 
# self.kernel_manager

 
def print_text(self, text):
 
"""
 Prints some plain text to the console
 """

 
self._append_plain_text(text, before_prompt=True)

 
def execute_command(self, command):
 
"""
 Execute a command in the frame of the console widget
 """

 
self._execute(command, False)


if __name__ == "__main__":
 app
= QtWidgets.QApplication(sys.argv)
 main
= ConsoleWidget_embed()
 main
.show()

while I am calling the juputer shell with:

 


def __init__(self):
   
global fit

   
QtWidgets.QMainWindow.__init__(self)
   
Ui_MainWindow.__init__(self)

   
self.setupUi(self)

   
self.console_widget = ConsoleWidget_embed(font_size = 10)
   
self.terminal_embeded.addTab(self.console_widget, "Jupyter")


Thanks!
Trifon
Reply all
Reply to author
Forward
0 new messages