Добавление виджета консоли Python / IPython в приложение Qt

#python #qt #ipython

#python #qt #ipython

Вопрос:

Я искал и искал хорошую информацию по этому вопросу, но мне не удалось найти решение.

Я работаю над приложением Qt, в котором есть встроенный интерпретатор python — все работает отлично! Пользователь может управлять приложением с помощью кода python, обработанного встроенным интерпретатором.

Моя проблема в том, что «консоль» — это немного больше, чем виджет редактирования строки, который, по сути, позволяет пользователю вводить текст во встроенный интерпретатор.

Что мне действительно нужно, так это виджет консоли python, управляющий моим встроенным интерпретатором python, с завершением вкладки. Завершение вкладки практически необходимо. Выделение текста было бы бонусом. Если бы я мог даже интегрировать обычную консоль python, я мог бы запустить ipython, используя трюк «from IPython import embed; embed ()».

Может быть сотня способов сделать это, и это может быть очевидно для некоторых, но, честно говоря, я побеждаю! Будем признательны за любую помощь.

Спасибо 🙂

Комментарии:

1. Вы можете сделать это с помощью виджета qtconsole от Jupyter (ранее IPython). Посмотрите на Spyder для примера приложения, которое это делает.

2. Привет, Томас. Спасибо за предложение. Я нашел это и частично проработал пример. Однако я считаю, что для этого требуется PySide / PyQt. PyQt для нас не вариант (если только это не обязательно), и я не уверен, в каком состоянии находится PySide в эти дни.

3. Если не считать переопределения qtconsole в C , это единственный известный мне способ сделать это. Он должен работать с PySide, если вы хотите попробовать это.

Ответ №1:

У меня была та же проблема. Возникла проблема с совместимостью. Сначала я загрузил Pycharm (редактор) и использовал этот код как виджет. Это работает.

 import sip

sip.setapi(u'QDate', 2)
sip.setapi(u'QDateTime', 2)
sip.setapi(u'QString', 2)
sip.setapi(u'QTextStream', 2)
sip.setapi(u'QTime', 2)
sip.setapi(u'QUrl', 2)
sip.setapi(u'QVariant', 2)


from IPython.lib import guisupport

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

class IPythonWidget(RichJupyterWidget):
    def __init__(self,customBanner=None,*args,**kwargs):
        if not customBanner is None: self.banner=customBanner
        super(IPythonWidget, self).__init__(*args,**kwargs)
        self.kernel_manager = kernel_manager = QtInProcessKernelManager()
        kernel_manager.start_kernel()
        kernel_manager.kernel.gui = 'qt4'
        self.kernel_client = kernel_client = self._kernel_manager.client()
        kernel_client.start_channels()

        def stop():
            kernel_client.stop_channels()
            kernel_manager.shutdown_kernel()
            guisupport.get_app_qt4().exit()
        self.exit_requested.connect(stop)

    def pushVariables(self,variableDict):
        """ Given a dictionary containing name / value pairs, push those variables to the IPython console widget """
        self.kernel_manager.kernel.shell.push(variableDict)
    def clearTerminal(self):
        """ Clears the terminal """
        self._control.clear()

    def printText(self,text):
        """ Prints some plain text to the console """
        #self._append_plain_text(text)
        self.append_stream(text)
    def executeCommand(self,command):
        """ Execute a command in the frame of the console widget """
      #  self._execute(command,False)
        self.execute(command,False)
 

Комментарии:

1. Привет, Альваро, извини, я давно здесь не проверял. Извините, я не уверен, как вы это использовали. Вы запускаете приложение PyQt и запускаете этот виджет? Я действительно ценю помощь, но было бы здорово получить немного больше информации.

2. Просто создайте виджет на python и добавьте его в макет. Я также использовал in внутри приложения Qt на C , где я просто выполнил исходный код python для инициализации и добавления виджета в макет приложения C …