1

ipython qtconsole を MDI pyqt アプリケーションにサブウィンドウとして配置し、qtconsole から他のサブウィンドウを作成したいと考えています。したがって、組み込みの qtconsole は、アプリケーションの名前空間にアクセスできる必要があります。ipython ドキュメントのこのページによると、InProcessKernel が最適なソリューションです。このサンプル スクリプト(以下に再現) を Python ターミナルから実行しました (ipython から実行すると、MultipleInstanceError が発生します)。しかし、ここではサブウィンドウの作成は忘れてください。まず、組み込みの qtconsole にオブジェクトを渡す方法を理解する必要があります。

  1. 初めて inprocess_qtconsole.py を実行したとき、埋め込まれた qtconsole の名前空間は空です。最初の python ターミナルまたはスクリプトで以前に作成されたオブジェクトが、組み込みの qtconsole に渡されないのはなぜですか?
  2. 組み込みの qtconsole を含むアプリケーションを閉じ、最初のターミナルでいくつかの変数を定義し、スクリプトを再度実行すると、これらの変数と、下のスクリプトの変数にアクセスできるようになるのはなぜif __name__ == __main__ですか?
  3. 起動元の python ターミナルをブロックせずに組み込みの qtconsole を起動する方法はありますか?

サブウィンドウを作成するには、このオブジェクト(のようなもの)を渡す必要があるため、QMainWindowインスタンスを埋め込みqtconsoleに渡すことができるようにしたいだけですwindow.mdiArea.addSubWindow()。スクリプトを 2 回実行すると、一種のハックな方法で動作します。

ところで、internal_ipkernelipython の他の公式サンプルの 1 つ (ipkernel_qtapp.py) で使用されているモジュールが、最新バージョンの 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()
4

1 に答える 1