中断embedded在QT4小部件中的IPython内核

我想embedded一个Ipythonterminal在QT小部件,所以我可以访问我的QT应用程序中的对象。 我知道这是可能的例如这样的例子: https : //github.com/gpoulin/python-test/blob/master/embedded_qtconsole.py然而,如果内核阻塞(例如在一个无限的while循环)整个应用程序没有响应,只能从运行qt应用程序的terminal键盘中断来终止。 如果我使用QtKernelManager而不是QtInProcessKernelManager,则可以成功地从qt应用程序中断内核,但由于内核embedded在不同的进程中,因此无法访问其中的对象。 在同一个进程中embeddedIPythonterminal时,有没有办法捕捉键盘中断? 还是应该使用embedded内核的不同实现?

我的改编的代码如下

import os os.environ['QT_API'] = 'pyqt' import sip sip.setapi("QString", 2) sip.setapi("QVariant", 2) import sys from PyQt4 import QtGui, QtCore from pkg_resources import require require('ipython') from IPython.qt.console.rich_ipython_widget import RichIPythonWidget from IPython.qt.inprocess import QtInProcessKernelManager class IPythonWidget(QtGui.QWidget): def __init__(self, **kwarg): super(IPythonWidget, self).__init__() self.initUI() def startIpKernel(self): self.kernel_manager = QtInProcessKernelManager() self.kernel_manager.start_kernel() self.kernel_manager.kernel.gui = 'qt4' self.kernel_client = kernel_client = self.kernel_manager.client() self.kernel_client.start_channels() def initUI(self): self.startIpKernel() self.addWidgets() def addWidgets(self): self.button = QtGui.QPushButton() self.button.setText("test button") self.console = RichIPythonWidget(self) self.console.kernel_manager =self.kernel_manager self.console.kernel_client = self.kernel_client self.console.kernel_manager.kernel.shell.push({"button": self.button})#this can be wrapped into another method vbox = QtGui.QVBoxLayout() vbox.addWidget(self.console) vbox.addWidget(self.button) self.setLayout(vbox) def mousePressEvent(self, event): self.mousepos = event.pos() if __name__ == '__main__': app = QtGui.QApplication(sys.argv) ex = IPythonWidget() ex.show() sys.exit(app.exec_())