'qtconsole no event loop in thread

I'm using qtconsole and want to move the code into it's own thread

import sys

from PySide6.QtCore import QThread
from qtconsole.rich_jupyter_widget import RichJupyterWidget
from qtconsole.inprocess import QtInProcessKernelManager
from PySide6.QtWidgets import QApplication


class Runner(RichJupyterWidget, QThread):
    def __init__(self):
        super().__init__()

        kernel_manager = QtInProcessKernelManager(kernel_name='python3')
        kernel_manager.start_kernel()

        kernel_client = kernel_manager.client()
        kernel_client.start_channels()

        self.kernel = kernel_manager.kernel

        self.kernel_manager = kernel_manager
        self.kernel_client = kernel_client

    def run(self):
        self.execute("""a = 1/0""")
        ret = self.kernel.shell.user_ns
        print(ret)


app = QApplication(sys.argv)
test = Runner()
test.start()

sys.exit(app.exec())

However, that throws the below exception

Traceback (most recent call last):
  File "/tmp/test/test.py", line 67, in run
    self.execute("""a = 1/0""")
  File "/tmp/test/.venv/lib/python3.10/site-packages/qtconsole/console_widget.py", line 660, in execute
    self.do_execute(source, True, '')
  File "/tmp/test/.venv/lib/python3.10/site-packages/qtconsole/history_console_widget.py", line 42, in do_execute
    super().do_execute(source, complete, indent)
  File "/tmp/test/.venv/lib/python3.10/site-packages/qtconsole/console_widget.py", line 670, in do_execute
    self._execute(source, False)
  File "/tmp/test/.venv/lib/python3.10/site-packages/qtconsole/frontend_widget.py", line 285, in _execute
    msg_id = self.kernel_client.execute(source, hidden)
  File "/tmp/test/.venv/lib/python3.10/site-packages/ipykernel/inprocess/client.py", line 114, in execute
    self._dispatch_to_kernel(msg)
  File "/tmp/test/.venv/lib/python3.10/site-packages/ipykernel/inprocess/client.py", line 182, in _dispatch_to_kernel
    loop = asyncio.get_event_loop()
  File "/usr/lib/python3.10/asyncio/events.py", line 656, in get_event_loop
    raise RuntimeError('There is no current event loop in thread %r.'
RuntimeError: There is no current event loop in thread 'Dummy-2'.

Is there a way to get the RichJupyterWidget to work inside its own thread?



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source