##// END OF EJS Templates
* Created an IPythonWidget subclass of FrontendWidget to contain IPython specific functionality....
epatters -
Show More
@@ -0,0 +1,80 b''
1 # Local imports.
2 from frontend_widget import FrontendWidget
3
4
5 class IPythonWidget(FrontendWidget):
6 """ A FrontendWidget for an IPython kernel.
7 """
8
9 #---------------------------------------------------------------------------
10 # 'FrontendWidget' interface
11 #---------------------------------------------------------------------------
12
13 def __init__(self, kernel_manager, parent=None):
14 super(IPythonWidget, self).__init__(kernel_manager, parent)
15
16 self._magic_overrides = {}
17
18 def execute_source(self, source, hidden=False, interactive=False):
19 """ Reimplemented to override magic commands.
20 """
21 magic_source = source.strip()
22 if magic_source.startswith('%'):
23 magic_source = magic_source[1:]
24 magic, sep, arguments = magic_source.partition(' ')
25 if not magic:
26 magic = magic_source
27
28 callback = self._magic_overrides.get(magic)
29 if callback:
30 output = callback(arguments)
31 if output:
32 self.appendPlainText(output)
33 self._show_prompt('>>> ')
34 return True
35 else:
36 return super(IPythonWidget, self).execute_source(source, hidden,
37 interactive)
38
39 #---------------------------------------------------------------------------
40 # 'IPythonWidget' interface
41 #---------------------------------------------------------------------------
42
43 def set_magic_override(self, magic, callback):
44 """ Overrides an IPython magic command. This magic will be intercepted
45 by the frontend rather than passed on to the kernel and 'callback'
46 will be called with a single argument: a string of argument(s) for
47 the magic. The callback can (optionally) return text to print to the
48 console.
49 """
50 self._magic_overrides[magic] = callback
51
52 def remove_magic_override(self, magic):
53 """ Removes the override for the specified magic, if there is one.
54 """
55 try:
56 del self._magic_overrides[magic]
57 except KeyError:
58 pass
59
60
61 if __name__ == '__main__':
62 import sys
63 from IPython.frontend.qt.kernelmanager import QtKernelManager
64
65 # Create KernelManager
66 xreq_addr = ('127.0.0.1', 5575)
67 sub_addr = ('127.0.0.1', 5576)
68 rep_addr = ('127.0.0.1', 5577)
69 kernel_manager = QtKernelManager(xreq_addr, sub_addr, rep_addr)
70 kernel_manager.sub_channel.start()
71 kernel_manager.xreq_channel.start()
72
73 # Launch application
74 app = QtGui.QApplication(sys.argv)
75 widget = IPythonWidget(kernel_manager)
76 widget.setWindowTitle('Python')
77 widget.resize(640, 480)
78 widget.show()
79 sys.exit(app.exec_())
80
@@ -47,7 +47,7 b' class FrontendHighlighter(PygmentsHighlighter):'
47
47
48
48
49 class FrontendWidget(HistoryConsoleWidget):
49 class FrontendWidget(HistoryConsoleWidget):
50 """ A Qt frontend for an IPython kernel.
50 """ A Qt frontend for a generic Python kernel.
51 """
51 """
52
52
53 # Emitted when an 'execute_reply' is received from the kernel.
53 # Emitted when an 'execute_reply' is received from the kernel.
@@ -63,7 +63,7 b' class FrontendWidget(HistoryConsoleWidget):'
63 self._call_tip_widget = CallTipWidget(self)
63 self._call_tip_widget = CallTipWidget(self)
64 self._compile = CommandCompiler()
64 self._compile = CommandCompiler()
65 self._completion_lexer = CompletionLexer(PythonLexer())
65 self._completion_lexer = CompletionLexer(PythonLexer())
66 self._hidden = False
66 self._hidden = True
67 self._highlighter = FrontendHighlighter(self)
67 self._highlighter = FrontendHighlighter(self)
68 self._kernel_manager = None
68 self._kernel_manager = None
69
69
@@ -127,6 +127,7 b' class FrontendWidget(HistoryConsoleWidget):'
127 shown. Returns whether the source executed (i.e., returns True only
127 shown. Returns whether the source executed (i.e., returns True only
128 if no more input is necessary).
128 if no more input is necessary).
129 """
129 """
130 # Use CommandCompiler to determine if more input is needed.
130 try:
131 try:
131 code = self._compile(source, symbol='single')
132 code = self._compile(source, symbol='single')
132 except (OverflowError, SyntaxError, ValueError):
133 except (OverflowError, SyntaxError, ValueError):
@@ -281,7 +282,7 b' class FrontendWidget(HistoryConsoleWidget):'
281 elif status == 'aborted':
282 elif status == 'aborted':
282 text = "ERROR: ABORTED\n"
283 text = "ERROR: ABORTED\n"
283 self.appendPlainText(text)
284 self.appendPlainText(text)
284 self._hidden = False
285 self._hidden = True
285 self._show_prompt('>>> ')
286 self._show_prompt('>>> ')
286 self.executed.emit(rep)
287 self.executed.emit(rep)
287
288
@@ -300,25 +301,3 b' class FrontendWidget(HistoryConsoleWidget):'
300 doc = rep['content']['docstring']
301 doc = rep['content']['docstring']
301 if doc:
302 if doc:
302 self._call_tip_widget.show_tip(doc)
303 self._call_tip_widget.show_tip(doc)
303
304
305 if __name__ == '__main__':
306 import sys
307 from IPython.frontend.qt.kernelmanager import QtKernelManager
308
309 # Create KernelManager
310 xreq_addr = ('127.0.0.1', 5575)
311 sub_addr = ('127.0.0.1', 5576)
312 rep_addr = ('127.0.0.1', 5577)
313 kernel_manager = QtKernelManager(xreq_addr, sub_addr, rep_addr)
314 kernel_manager.sub_channel.start()
315 kernel_manager.xreq_channel.start()
316
317 # Launch application
318 app = QtGui.QApplication(sys.argv)
319 widget = FrontendWidget(kernel_manager)
320 widget.setWindowTitle('Python')
321 widget.resize(640, 480)
322 widget.show()
323 sys.exit(app.exec_())
324
@@ -118,7 +118,7 b' class SubSocketChannel(ZmqSocketChannel):'
118 self._flushed = False
118 self._flushed = False
119 self.ioloop.add_callback(self._flush)
119 self.ioloop.add_callback(self._flush)
120 while not self._flushed:
120 while not self._flushed:
121 time.sleep(0)
121 time.sleep(0.01)
122
122
123 def _flush(self):
123 def _flush(self):
124 """Called in this thread by the IOLoop to indicate that all events have
124 """Called in this thread by the IOLoop to indicate that all events have
General Comments 0
You need to be logged in to leave comments. Login now