向Qt应用程序添加Python / IPython控制台小部件

时间:2016-10-13 20:10:45

标签: python qt ipython

我搜索并搜索了有关此内容的详细信息,但我一直无法找到解决方案。

我正在开发一个带有嵌入式python解释器的Qt应用程序 - 一切正常!用户可以通过嵌入式解释器处理的python代码来驱动应用程序。

我的问题是"控制台"只是一个行编辑小部件,它基本上允许用户输入文本到嵌入式解释器。

我真正需要的是python控制台小部件驱动我的嵌入式python解释器,标签已完成。 Tab完成几乎是必不可少的。文字突出显示将是一个奖励。如果我甚至可以集成一个普通的python控制台,我可以使用来自IPython import embed的"来启动ipython;嵌入()"特技。

可能有一百种方法可以做到这一点,对一些人来说可能是显而易见的,但老实说让我击败了!非常感谢任何帮助。

谢谢:)

1 个答案:

答案 0 :(得分: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)