|
|
#!/usr/bin/env python
|
|
|
"""Example integrating an IPython kernel into a GUI App.
|
|
|
|
|
|
This trivial GUI application internally starts an IPython kernel, to which Qt
|
|
|
consoles can be connected either by the user at the command line or started
|
|
|
from the GUI itself, via a button. The GUI can also manipulate one variable in
|
|
|
the kernel's namespace, and print the namespace to the console.
|
|
|
|
|
|
Play with it by running the script and then opening one or more consoles, and
|
|
|
pushing the 'Counter++' and 'Namespace' buttons.
|
|
|
|
|
|
Upon exit, it should automatically close all consoles opened from the GUI.
|
|
|
|
|
|
Consoles attached separately from a terminal will not be terminated, though
|
|
|
they will notice that their kernel died.
|
|
|
"""
|
|
|
#-----------------------------------------------------------------------------
|
|
|
# Imports
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
|
from PyQt4 import Qt
|
|
|
|
|
|
from internal_ipkernel import InternalIPKernel
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
# Functions and classes
|
|
|
#-----------------------------------------------------------------------------
|
|
|
class SimpleWindow(Qt.QWidget, InternalIPKernel):
|
|
|
|
|
|
def __init__(self, app):
|
|
|
Qt.QWidget.__init__(self)
|
|
|
self.app = app
|
|
|
self.add_widgets()
|
|
|
self.init_ipkernel('qt')
|
|
|
|
|
|
def add_widgets(self):
|
|
|
self.setGeometry(300, 300, 400, 70)
|
|
|
self.setWindowTitle('IPython in your app')
|
|
|
|
|
|
# Add simple buttons:
|
|
|
console = Qt.QPushButton('Qt Console', self)
|
|
|
console.setGeometry(10, 10, 100, 35)
|
|
|
self.connect(console, Qt.SIGNAL('clicked()'), self.new_qt_console)
|
|
|
|
|
|
namespace = Qt.QPushButton('Namespace', self)
|
|
|
namespace.setGeometry(120, 10, 100, 35)
|
|
|
self.connect(namespace, Qt.SIGNAL('clicked()'), self.print_namespace)
|
|
|
|
|
|
count = Qt.QPushButton('Count++', self)
|
|
|
count.setGeometry(230, 10, 80, 35)
|
|
|
self.connect(count, Qt.SIGNAL('clicked()'), self.count)
|
|
|
|
|
|
# Quit and cleanup
|
|
|
quit = Qt.QPushButton('Quit', self)
|
|
|
quit.setGeometry(320, 10, 60, 35)
|
|
|
self.connect(quit, Qt.SIGNAL('clicked()'), Qt.qApp, Qt.SLOT('quit()'))
|
|
|
|
|
|
self.app.connect(self.app, Qt.SIGNAL("lastWindowClosed()"),
|
|
|
self.app, Qt.SLOT("quit()"))
|
|
|
|
|
|
self.app.aboutToQuit.connect(self.cleanup_consoles)
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
# Main script
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
app = Qt.QApplication([])
|
|
|
# Create our window
|
|
|
win = SimpleWindow(app)
|
|
|
win.show()
|
|
|
|
|
|
# Very important, IPython-specific step: this gets GUI event loop
|
|
|
# integration going, and it replaces calling app.exec_()
|
|
|
win.ipkernel.start()
|
|
|
|