ipython qtconsole を MDI pyqt アプリケーションにサブウィンドウとして配置し、qtconsole から他のサブウィンドウを作成したいと考えています。したがって、組み込みの qtconsole は、アプリケーションの名前空間にアクセスできる必要があります。ipython ドキュメントのこのページによると、InProcessKernel が最適なソリューションです。このサンプル スクリプト(以下に再現) を Python ターミナルから実行しました (ipython から実行すると、MultipleInstanceError が発生します)。しかし、ここではサブウィンドウの作成は忘れてください。まず、組み込みの qtconsole にオブジェクトを渡す方法を理解する必要があります。
- 初めて inprocess_qtconsole.py を実行したとき、埋め込まれた qtconsole の名前空間は空です。最初の python ターミナルまたはスクリプトで以前に作成されたオブジェクトが、組み込みの qtconsole に渡されないのはなぜですか?
- 組み込みの qtconsole を含むアプリケーションを閉じ、最初のターミナルでいくつかの変数を定義し、スクリプトを再度実行すると、これらの変数と、下のスクリプトの変数にアクセスできるようになるのはなぜ
if __name__ == __main__
ですか? - 起動元の python ターミナルをブロックせずに組み込みの qtconsole を起動する方法はありますか?
サブウィンドウを作成するには、このオブジェクト(のようなもの)を渡す必要があるため、QMainWindowインスタンスを埋め込みqtconsoleに渡すことができるようにしたいだけですwindow.mdiArea.addSubWindow()
。スクリプトを 2 回実行すると、一種のハックな方法で動作します。
ところで、internal_ipkernel
ipython の他の公式サンプルの 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()