gpt4 book ai didi

python - 嵌入 ipython qtconsole 和传递对象

转载 作者:太空宇宙 更新时间:2023-11-04 10:30:56 26 4
gpt4 key购买 nike

我想把一个ipython qtconsole作为一个子窗口放在MDI pyqt应用程序中,然后从qtconsole创建其他子窗口。所以嵌入式qtconsole需要能够访问应用程序的命名空间。根据this page从 ipython 文档,一个 InProcessKernel 将是最好的解决方案。我跑了 this example script (转载如下)来自 python 终端(如果我从 ipython 运行它,我会得到一个 MultipleInstanceError)。但是暂时忘记创建子窗口,首先我需要弄清楚如何将对象传递到嵌入式 qtconsole。

  1. 我第一次运行 inprocess_qtconsole.py 时,嵌入式 qtconsole 的命名空间是空的。为什么之前在初始 python 终端或脚本中创建的对象没有传递到嵌入式 qtconsole?
  2. 如果我关闭包含嵌入式 qtconsole 的应用程序,在初始终端中定义一些变量,然后再次运行脚本,为什么我现在可以访问这些变量,以及 if __name__ = 下的脚本中的变量= __main__ ?
  3. 有没有办法启动嵌入式 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)

关于python - 嵌入 ipython qtconsole 和传递对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26666583/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com