##// END OF EJS Templates
Added support for Ctrl-Enter (unconditionally enter a newline) to ConsoleWidget....
Added support for Ctrl-Enter (unconditionally enter a newline) to ConsoleWidget. This works at the ConsoleWidget level, but it can confuse InputSplitter to create some unintuitive auto-execution results. InputSplitter will probably need some fixes.

File last commit:

r2661:595fc3b9
r2985:d6f22aa1
Show More
ipythonx.py
118 lines | 3.3 KiB | text/x-python | PythonLexer
Gael Varoquaux
Add demo app. Add callback for exit to the ipython0 code.
r1391 """
Entry point for a simple application giving a graphical frontend to
ipython.
"""
gvaroquaux
Helpful error message if trying to run the ipythonx entry point without...
r1477 try:
import wx
except ImportError, e:
Brian Granger
Remove usage of deprecated .message attribute of exceptions....
r2293 e.args[0] = """%s
gvaroquaux
Helpful error message if trying to run the ipythonx entry point without...
r1477 ________________________________________________________________________________
You need wxPython to run this application.
Brian Granger
Remove usage of deprecated .message attribute of exceptions....
r2293 """ % e.args[0]
gvaroquaux
Helpful error message if trying to run the ipythonx entry point without...
r1477 raise e
Gael Varoquaux
Add demo app. Add callback for exit to the ipython0 code.
r1391 from wx_frontend import WxController
Gael Varoquaux
First cut of subprocess execution with redirection of stdin/stdout.
r1437 import __builtin__
Gael Varoquaux
Add demo app. Add callback for exit to the ipython0 code.
r1391
Gael Varoquaux
Add a banner.
r1495
Gael Varoquaux
Fixed a race-condition in subprocess execution....
r1438 class IPythonXController(WxController):
Gael Varoquaux
Add demo app. Add callback for exit to the ipython0 code.
r1391 """ Sub class of WxController that adds some application-specific
bindings.
"""
gvaroquaux
Clean up the test application for the wx frontend.
r1475 debug = False
Gael Varoquaux
Proper redirection of keystrokes to subprocesses.
r1450
Gael Varoquaux
Add demo app. Add callback for exit to the ipython0 code.
r1391 def __init__(self, *args, **kwargs):
WxController.__init__(self, *args, **kwargs)
self.ipython0.ask_exit = self.do_exit
Gael Varoquaux
Add a banner.
r1495 # Scroll to top
maxrange = self.GetScrollRange(wx.VERTICAL)
self.ScrollLines(-maxrange)
Gael Varoquaux
Add demo app. Add callback for exit to the ipython0 code.
r1391
def _on_key_down(self, event, skip=True):
# Intercept Ctrl-D to quit
if event.KeyCode == ord('D') and event.ControlDown() and \
gvaroquaux
More code reuse between GUI-independant frontend and Wx frontend: getting...
r1462 self.input_buffer == '' and \
gvaroquaux
Make process execution work under windows.
r1449 self._input_state == 'readline':
Gael Varoquaux
Add demo app. Add callback for exit to the ipython0 code.
r1391 wx.CallAfter(self.ask_exit)
else:
WxController._on_key_down(self, event, skip=skip)
def ask_exit(self):
""" Ask the user whether to exit.
"""
gvaroquaux
Fix segfaults under windows.
r1479 self._input_state = 'subprocess'
self.write('\n', refresh=False)
Gael Varoquaux
Add demo app. Add callback for exit to the ipython0 code.
r1391 self.capture_output()
Brian Granger
More work addressing review comments for Fernando's branch....
r2499 self.ipython0.exit()
Gael Varoquaux
Add demo app. Add callback for exit to the ipython0 code.
r1391 self.release_output()
if not self.ipython0.exit_now:
gvaroquaux
Fix segfaults under windows.
r1479 wx.CallAfter(self.new_prompt,
self.input_prompt_template.substitute(
Gael Varoquaux
More tests of the frontend. Improve the ease of testing.
r1458 number=self.last_result['number'] + 1))
gvaroquaux
Better fonts on MacOSX....
r1502 else:
wx.CallAfter(wx.GetApp().Exit)
self.write('Exiting ...', refresh=False)
Gael Varoquaux
Add demo app. Add callback for exit to the ipython0 code.
r1391
def do_exit(self):
""" Exits the interpreter, kills the windows.
"""
WxController.do_exit(self)
self.release_output()
Gael Varoquaux
Clean up exit code.
r1392 wx.CallAfter(wx.Exit)
Gael Varoquaux
Add demo app. Add callback for exit to the ipython0 code.
r1391
Gael Varoquaux
Fixed a race-condition in subprocess execution....
r1438 class IPythonX(wx.Frame):
""" Main frame of the IPythonX app.
Gael Varoquaux
Add demo app. Add callback for exit to the ipython0 code.
r1391 """
gvaroquaux
Tweak the debug mode....
r1484 def __init__(self, parent, id, title, debug=False):
Gael Varoquaux
Add demo app. Add callback for exit to the ipython0 code.
r1391 wx.Frame.__init__(self, parent, id, title, size=(300,250))
self._sizer = wx.BoxSizer(wx.VERTICAL)
gvaroquaux
Tweak the debug mode....
r1484 self.shell = IPythonXController(self, debug=debug)
Gael Varoquaux
Add demo app. Add callback for exit to the ipython0 code.
r1391 self._sizer.Add(self.shell, 1, wx.EXPAND)
self.SetSizer(self._sizer)
self.SetAutoLayout(1)
self.Show(True)
Gael Varoquaux
IPythonX: terminate the mainloop when exiting, to close the child windows...
r1732 wx.EVT_CLOSE(self, self.on_close)
def on_close(self, event):
""" Called on closing the windows.
Stops the event loop, to close all the child windows.
"""
wx.CallAfter(wx.Exit)
Gael Varoquaux
Add demo app. Add callback for exit to the ipython0 code.
r1391
def main():
gvaroquaux
Clean up the test application for the wx frontend.
r1475 from optparse import OptionParser
usage = """usage: %prog [options]
Simple graphical frontend to IPython, using WxWidgets."""
parser = OptionParser(usage=usage)
parser.add_option("-d", "--debug",
action="store_true", dest="debug", default=False,
help="Enable debug message for the wx frontend.")
options, args = parser.parse_args()
gvaroquaux
Fix segfaults under windows.
r1479 # Clear the options, to avoid having the ipython0 instance complain
import sys
sys.argv = sys.argv[:1]
Gael Varoquaux
Add demo app. Add callback for exit to the ipython0 code.
r1391 app = wx.PySimpleApp()
gvaroquaux
Tweak the debug mode....
r1484 frame = IPythonX(None, wx.ID_ANY, 'IPythonX', debug=options.debug)
Gael Varoquaux
Add demo app. Add callback for exit to the ipython0 code.
r1391 frame.shell.SetFocus()
frame.shell.app = app
frame.SetSize((680, 460))
app.MainLoop()
if __name__ == '__main__':
main()