我正在为我的实验室开发PyQt软件。在这个软件中,我正在加载不同类型的RAW并分析来自mySQL数据库的数据(通常是在数组中)。
我想在Widget中集成一个Iython控制台,这样我就可以轻松地与这些数据进行交互。
我在使用Ipython 0.13时遇到了一些困难 这是我已经拥有的(整个代码很长,所以我只显示包含小部件的部分,Ipython控制台和相应的导入行,如果您需要更多,请告诉我):
##I load everything useful to my application, including the following line
from IPython.frontend.qt.console.qtconsoleapp import IPythonQtConsoleApp
##then is my whole software
##here is a class containing the Graphical User Interface elements. A button call the following function. self.Shell_Widget is the widget containing the Ipython console, self.MainWindow is the application mainwindow
def EmbeddedIpython(self):
"""
This function should launch an Ipython console
"""
self.Shell_Widget = QtGui.QDockWidget(self.MainWindow) #Widget creation
self.MainWindow.addDockWidget(4,self.Shell_Widget)
self.Shell_Widget.setMinimumSize(400,420)
console = IPythonQtConsoleApp() #Console Creation
console.initialize()
console.start()
self.Shell_Widget.show()
所以,正如想要的那样,Ipython控制台已经启动,似乎可以工作,但我无法访问整个应用程序变量,数组等...我认为Ipython控制台是独立于我的软件启动的,但这里是我的编程限制...... 有人知道如何在我的应用程序中启动Ipython吗?可能是缺少参数,或者是集成Ipython的不同方式。
有关信息,这不起作用: Embedding IPython Qt console in a PyQt application
感谢您的帮助!!
答案 0 :(得分:2)
mentioned link似乎在这里完美无缺:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import atexit
from IPython.zmq.ipkernel import IPKernelApp
from IPython.lib.kernel import find_connection_file
from IPython.frontend.qt.kernelmanager import QtKernelManager
from IPython.frontend.qt.console.rich_ipython_widget import RichIPythonWidget
from IPython.utils.traitlets import TraitError
from PyQt4 import QtGui, QtCore
def event_loop(kernel):
kernel.timer = QtCore.QTimer()
kernel.timer.timeout.connect(kernel.do_one_iteration)
kernel.timer.start(1000*kernel._poll_interval)
def default_kernel_app():
app = IPKernelApp.instance()
app.initialize(['python', '--pylab=qt'])
app.kernel.eventloop = event_loop
return app
def default_manager(kernel):
connection_file = find_connection_file(kernel.connection_file)
manager = QtKernelManager(connection_file=connection_file)
manager.load_connection_file()
manager.start_channels()
atexit.register(manager.cleanup_connection_file)
return manager
def console_widget(manager):
try: # Ipython v0.13
widget = RichIPythonWidget(gui_completion='droplist')
except TraitError: # IPython v0.12
widget = RichIPythonWidget(gui_completion=True)
widget.kernel_manager = manager
return widget
def terminal_widget(**kwargs):
kernel_app = default_kernel_app()
manager = default_manager(kernel_app)
widget = console_widget(manager)
#update namespace
kernel_app.shell.user_ns.update(kwargs)
kernel_app.start()
return widget
class mainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
super(mainWindow, self).__init__(parent)
self.console = terminal_widget(testing=123)
print "\nAn Embeded Ipython Console!"
self.textEdit = QtGui.QTextEdit()
self.dockShell = QtGui.QDockWidget(self)
self.dockShell.setWidget(self.textEdit)
self.addDockWidget(4, self.dockShell)
self.setCentralWidget(self.console)
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
main = mainWindow()
main.show()
sys.exit(app.exec_())