Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在qtconsole上嵌入ipython和传递对象_Python_Pyqt_Ipython_Qtconsole - Fatal编程技术网

在qtconsole上嵌入ipython和传递对象

在qtconsole上嵌入ipython和传递对象,python,pyqt,ipython,qtconsole,Python,Pyqt,Ipython,Qtconsole,我想将ipython qtconsole作为子窗口放在MDI pyqt应用程序中,然后从qtconsole创建其他子窗口。因此,嵌入式qtconsole需要能够访问应用程序的名称空间。根据ipython文档,InProcessKernel将是最好的解决方案。我从python终端运行(如下所示)(如果我从ipython运行它,我会得到一个MultipleInstanceError)。但是现在先别管创建子窗口了,首先我需要弄清楚如何将对象传递到嵌入式控制台 第一次运行inprocess_qtcons

我想将ipython qtconsole作为子窗口放在MDI pyqt应用程序中,然后从qtconsole创建其他子窗口。因此,嵌入式qtconsole需要能够访问应用程序的名称空间。根据ipython文档,InProcessKernel将是最好的解决方案。我从python终端运行(如下所示)(如果我从ipython运行它,我会得到一个MultipleInstanceError)。但是现在先别管创建子窗口了,首先我需要弄清楚如何将对象传递到嵌入式控制台

  • 第一次运行inprocess_qtconsole.py时,嵌入式qtconsole的命名空间为空。为什么以前在初始python终端或脚本中创建的对象没有传递到嵌入式控制台
  • 如果我关闭包含嵌入式qtconsole的应用程序,在初始终端中定义一些变量,然后再次运行脚本,为什么我现在可以访问这些变量,以及
    下脚本中的变量(如果_name__===_main__
  • 有没有一种方法可以启动嵌入式qtconsole而不阻塞我启动它的python终端
  • 我主要希望能够将QMainWindow实例传递到嵌入式qtconsole中,因为创建子窗口需要传递此对象(类似于
    window.mdiArea.addSubWindow()
    )。如果我运行两次脚本,它的工作方式有点像黑客

    顺便说一句,另一个官方ipython示例(ipkernel_qtapp.py)中使用的
    internal_ipkernel
    模块似乎在最新版本的ipython中缺失

    运行Python 2.7、IPython 2.2/2.3和Windows 8.1

    from __future__ import print_function
    import os
    
    from IPython.qt.console.rich_ipython_widget import RichIPythonWidget
    from IPython.qt.inprocess import QtInProcessKernelManager
    from IPython.lib import guisupport
    
    
    def print_process_id():
        print('Process ID is:', os.getpid())
    
    
    def main():
        # Print the ID of the main process
        print_process_id()
    
        app = guisupport.get_app_qt4()
    
        # Create an in-process kernel
        # >>> print_process_id()
        # will print the same process ID as the main process
        kernel_manager = QtInProcessKernelManager()
        kernel_manager.start_kernel()
        kernel = kernel_manager.kernel
        kernel.gui = 'qt4'
        kernel.shell.push({'foo': 43, 'print_process_id': print_process_id})
    
        kernel_client = kernel_manager.client()
        kernel_client.start_channels()
    
        def stop():
            kernel_client.stop_channels()
            kernel_manager.shutdown_kernel()
            app.exit()
    
        control = RichIPythonWidget()
        control.kernel_manager = kernel_manager
        control.kernel_client = kernel_client
        control.exit_requested.connect(stop)
        control.show()
    
        guisupport.start_event_loop_qt4(app)
    
    
    if __name__ == '__main__':
        test = 'hello'
        main()
    

    您可以使用它在给定的qt小部件中启动ipython控制台:

    from IPython.qt.console.rich_ipython_widget import RichIPythonWidget
    from IPython.qt.inprocess import QtInProcessKernelManager
    
    def put_ipy(parent):
        kernel_manager = QtInProcessKernelManager()
        kernel_manager.start_kernel()
        kernel = kernel_manager.kernel
        kernel.gui = 'qt4'
    
        kernel_client = kernel_manager.client()
        kernel_client.start_channels()
        kernel_client.namespace  = parent
    
        def stop():
            kernel_client.stop_channels()
            kernel_manager.shutdown_kernel()
    
        layout = QtGui.QVBoxLayout(parent)
        widget = RichIPythonWidget(parent=parent)
        layout.addWidget(widget)
        widget.kernel_manager = kernel_manager
        widget.kernel_client = kernel_client
        widget.exit_requested.connect(stop)
        ipython_widget = widget
        ipython_widget.show()
        kernel.shell.push({'widget':widget,'kernel':kernel, 'parent':parent})
        return {'widget':widget,'kernel':kernel}
    
    要从控制台弹出窗口,您可以运行

    app = QtGui.QApplication([])
    win = QtGui.QWidget(None)
    win.show()
    put_ipy(win)
    
    但是这会将原始python解释器替换为一个空的ipy解释器,只定义您传递的变量(这里是widget、kernel、parent),即控制台和命令行都有相同的内核,并且原始解释器被阻塞


    您可以通过使用另一个主窗口和一组交互在qt应用程序中执行上述操作来避免这种行为。要将变量传递给内核,请使用(如上)
    kernel.shell.push(dict)

    您可以使用此命令在给定的qt小部件中启动ipython控制台:

    from IPython.qt.console.rich_ipython_widget import RichIPythonWidget
    from IPython.qt.inprocess import QtInProcessKernelManager
    
    def put_ipy(parent):
        kernel_manager = QtInProcessKernelManager()
        kernel_manager.start_kernel()
        kernel = kernel_manager.kernel
        kernel.gui = 'qt4'
    
        kernel_client = kernel_manager.client()
        kernel_client.start_channels()
        kernel_client.namespace  = parent
    
        def stop():
            kernel_client.stop_channels()
            kernel_manager.shutdown_kernel()
    
        layout = QtGui.QVBoxLayout(parent)
        widget = RichIPythonWidget(parent=parent)
        layout.addWidget(widget)
        widget.kernel_manager = kernel_manager
        widget.kernel_client = kernel_client
        widget.exit_requested.connect(stop)
        ipython_widget = widget
        ipython_widget.show()
        kernel.shell.push({'widget':widget,'kernel':kernel, 'parent':parent})
        return {'widget':widget,'kernel':kernel}
    
    要从控制台弹出窗口,您可以运行

    app = QtGui.QApplication([])
    win = QtGui.QWidget(None)
    win.show()
    put_ipy(win)
    
    但是这会将原始python解释器替换为一个空的ipy解释器,只定义您传递的变量(这里是widget、kernel、parent),即控制台和命令行都有相同的内核,并且原始解释器被阻塞


    您可以通过使用另一个主窗口和一组交互在qt应用程序中执行上述操作来避免这种行为。要将变量传递给内核,请使用(如上所述)
    kernel.shell.push(dict)

    啊,好吧,不知怎的,我错过了传递对象的方法
    kernel.shell.push
    。避免阻塞的方法是省略通常的
    app.exec()
    guisupport.start\u event\u loop\u qt4(app)
    。谢谢谢谢,回答得很好!从
    IPython.qt
    导入现在已被弃用,取而代之的是从
    qtconsole
    导入。最近控制台出现异常后,我得到
    错误:执行中止
    !有人有主意吗?啊,好吧,不知怎么的,我错过了传递对象的方法
    kernel.shell.push。避免阻塞的方法是省略通常的
    app.exec()
    guisupport.start\u event\u loop\u qt4(app)
    。谢谢谢谢,回答得很好!从
    IPython.qt
    导入现在已被弃用,取而代之的是从
    qtconsole
    导入。最近控制台出现异常后,我得到
    错误:执行中止
    !有人有主意吗?