Show More
@@ -0,0 +1,80 b'' | |||||
|
1 | """ | |||
|
2 | Entry point for a simple application giving a graphical frontend to | |||
|
3 | ipython. | |||
|
4 | """ | |||
|
5 | ||||
|
6 | import wx | |||
|
7 | from wx_frontend import WxController | |||
|
8 | ||||
|
9 | class WIPythonController(WxController): | |||
|
10 | """ Sub class of WxController that adds some application-specific | |||
|
11 | bindings. | |||
|
12 | """ | |||
|
13 | ||||
|
14 | def __init__(self, *args, **kwargs): | |||
|
15 | WxController.__init__(self, *args, **kwargs) | |||
|
16 | self.ipython0.ask_exit = self.do_exit | |||
|
17 | ||||
|
18 | ||||
|
19 | def _on_key_down(self, event, skip=True): | |||
|
20 | # Intercept Ctrl-D to quit | |||
|
21 | if event.KeyCode == ord('D') and event.ControlDown() and \ | |||
|
22 | self.get_current_edit_buffer()=='': | |||
|
23 | wx.CallAfter(self.ask_exit) | |||
|
24 | else: | |||
|
25 | WxController._on_key_down(self, event, skip=skip) | |||
|
26 | ||||
|
27 | ||||
|
28 | def ask_exit(self): | |||
|
29 | """ Ask the user whether to exit. | |||
|
30 | """ | |||
|
31 | self.write('\n') | |||
|
32 | self.capture_output() | |||
|
33 | self.ipython0.shell.exit() | |||
|
34 | self.release_output() | |||
|
35 | wx.Yield() | |||
|
36 | if not self.ipython0.exit_now: | |||
|
37 | self.new_prompt(self.prompt % (self.last_result['number'] + 1)) | |||
|
38 | ||||
|
39 | ||||
|
40 | def do_exit(self): | |||
|
41 | """ Exits the interpreter, kills the windows. | |||
|
42 | """ | |||
|
43 | WxController.do_exit(self) | |||
|
44 | # Remove the callbacks, to avoid PyDeadObjectErrors | |||
|
45 | do_nothing = lambda *args, **kwargs: True | |||
|
46 | self.release_output() | |||
|
47 | self._on_key_down = do_nothing | |||
|
48 | self._on_key_up = do_nothing | |||
|
49 | self._on_enter = do_nothing | |||
|
50 | self.after_execute = do_nothing | |||
|
51 | wx.Yield() | |||
|
52 | wx.CallAfter(self.Parent.Destroy) | |||
|
53 | ||||
|
54 | ||||
|
55 | ||||
|
56 | class WIPython(wx.Frame): | |||
|
57 | """ Main frame of the WIPython app. | |||
|
58 | """ | |||
|
59 | ||||
|
60 | def __init__(self, parent, id, title): | |||
|
61 | wx.Frame.__init__(self, parent, id, title, size=(300,250)) | |||
|
62 | self._sizer = wx.BoxSizer(wx.VERTICAL) | |||
|
63 | self.shell = WIPythonController(self) | |||
|
64 | self._sizer.Add(self.shell, 1, wx.EXPAND) | |||
|
65 | self.SetSizer(self._sizer) | |||
|
66 | self.SetAutoLayout(1) | |||
|
67 | self.Show(True) | |||
|
68 | ||||
|
69 | ||||
|
70 | def main(): | |||
|
71 | app = wx.PySimpleApp() | |||
|
72 | frame = WIPython(None, wx.ID_ANY, 'WIpython') | |||
|
73 | frame.shell.SetFocus() | |||
|
74 | frame.shell.app = app | |||
|
75 | frame.SetSize((680, 460)) | |||
|
76 | ||||
|
77 | app.MainLoop() | |||
|
78 | ||||
|
79 | if __name__ == '__main__': | |||
|
80 | main() |
@@ -49,7 +49,7 b' ip.expose_magic("rehash", magic_rehash)' | |||||
49 | def magic_Quit(self, parameter_s=''): |
|
49 | def magic_Quit(self, parameter_s=''): | |
50 | """Exit IPython without confirmation (like %Exit).""" |
|
50 | """Exit IPython without confirmation (like %Exit).""" | |
51 |
|
51 | |||
52 |
self.shell. |
|
52 | self.shell.ask_exit() | |
53 |
|
53 | |||
54 | ip.expose_magic("Quit", magic_Quit) |
|
54 | ip.expose_magic("Quit", magic_Quit) | |
55 |
|
55 |
@@ -2459,7 +2459,7 b' Defaulting color scheme to \'NoColor\'"""' | |||||
2459 | def magic_Exit(self, parameter_s=''): |
|
2459 | def magic_Exit(self, parameter_s=''): | |
2460 | """Exit IPython without confirmation.""" |
|
2460 | """Exit IPython without confirmation.""" | |
2461 |
|
2461 | |||
2462 |
self.shell. |
|
2462 | self.shell.ask_exit() | |
2463 |
|
2463 | |||
2464 | #...................................................................... |
|
2464 | #...................................................................... | |
2465 | # Functions to implement unix shell-type things |
|
2465 | # Functions to implement unix shell-type things |
@@ -24,6 +24,7 b' from IPython.ipapi import IPApi' | |||||
24 | from IPython.kernel.core.sync_output_trap import SyncOutputTrap |
|
24 | from IPython.kernel.core.sync_output_trap import SyncOutputTrap | |
25 |
|
25 | |||
26 | from IPython.genutils import Term |
|
26 | from IPython.genutils import Term | |
|
27 | import pydoc | |||
27 |
|
28 | |||
28 | #------------------------------------------------------------------------------- |
|
29 | #------------------------------------------------------------------------------- | |
29 | # Utility functions (temporary, should be moved out of here) |
|
30 | # Utility functions (temporary, should be moved out of here) | |
@@ -71,9 +72,10 b' class PrefilterFrontEnd(LineFrontEndBase):' | |||||
71 | # terminal |
|
72 | # terminal | |
72 | self.shell.output_trap = SyncOutputTrap(write_out=self.write, |
|
73 | self.shell.output_trap = SyncOutputTrap(write_out=self.write, | |
73 | write_err=self.write) |
|
74 | write_err=self.write) | |
74 |
|
75 | # Capture and release the outputs, to make sure all the | ||
75 | import pydoc |
|
76 | # shadow variables are set | |
76 | pydoc.help.output = self.shell.output_trap.out |
|
77 | self.capture_output() | |
|
78 | self.release_output() | |||
77 |
|
79 | |||
78 |
|
80 | |||
79 | def prefilter_input(self, input_string): |
|
81 | def prefilter_input(self, input_string): | |
@@ -105,8 +107,15 b' class PrefilterFrontEnd(LineFrontEndBase):' | |||||
105 | self.release_output() |
|
107 | self.release_output() | |
106 |
|
108 | |||
107 |
|
109 | |||
|
110 | def execute(self, python_string, raw_string=None): | |||
|
111 | self.capture_output() | |||
|
112 | LineFrontEndBase.execute(self, python_string, | |||
|
113 | raw_string=raw_string) | |||
|
114 | self.release_output() | |||
|
115 | ||||
|
116 | ||||
108 | def capture_output(self): |
|
117 | def capture_output(self): | |
109 | """ Capture all the output mechanism we can think of. |
|
118 | """ Capture all the output mechanisms we can think of. | |
110 | """ |
|
119 | """ | |
111 | self.__old_cout_write = Term.cout.write |
|
120 | self.__old_cout_write = Term.cout.write | |
112 | self.__old_err_write = Term.cerr.write |
|
121 | self.__old_err_write = Term.cerr.write | |
@@ -116,16 +125,18 b' class PrefilterFrontEnd(LineFrontEndBase):' | |||||
116 | self.__old_stderr= sys.stderr |
|
125 | self.__old_stderr= sys.stderr | |
117 | sys.stdout = Term.cout |
|
126 | sys.stdout = Term.cout | |
118 | sys.stderr = Term.cerr |
|
127 | sys.stderr = Term.cerr | |
|
128 | self.__old_help_output = pydoc.help.output | |||
|
129 | pydoc.help.output = self.shell.output_trap.out | |||
119 |
|
130 | |||
120 |
|
131 | |||
121 | def release_output(self): |
|
132 | def release_output(self): | |
122 |
""" Release all the different captures we have made |
|
133 | """ Release all the different captures we have made. | |
123 | and flush the buffers. |
|
|||
124 | """ |
|
134 | """ | |
125 | Term.cout.write = self.__old_cout_write |
|
135 | Term.cout.write = self.__old_cout_write | |
126 | Term.cerr.write = self.__old_err_write |
|
136 | Term.cerr.write = self.__old_err_write | |
127 | sys.stdout = self.__old_stdout |
|
137 | sys.stdout = self.__old_stdout | |
128 | sys.stderr = self.__old_stderr |
|
138 | sys.stderr = self.__old_stderr | |
|
139 | pydoc.help.output = self.__old_help_output | |||
129 |
|
140 | |||
130 |
|
141 | |||
131 | def complete(self, line): |
|
142 | def complete(self, line): | |
@@ -139,3 +150,8 b' class PrefilterFrontEnd(LineFrontEndBase):' | |||||
139 | return line, completions |
|
150 | return line, completions | |
140 |
|
151 | |||
141 |
|
152 | |||
|
153 | def do_exit(self): | |||
|
154 | """ Exit the shell, cleanup and save the history. | |||
|
155 | """ | |||
|
156 | self.ipython0.atexit_operations() | |||
|
157 |
@@ -151,10 +151,18 b' class WxController(PrefilterFrontEnd, ConsoleWidget):' | |||||
151 | #self.SetSelection(self.GetLength()-1, self.GetLength()) |
|
151 | #self.SetSelection(self.GetLength()-1, self.GetLength()) | |
152 | #self.ReplaceSelection('') |
|
152 | #self.ReplaceSelection('') | |
153 | self.GotoPos(self.GetLength()) |
|
153 | self.GotoPos(self.GetLength()) | |
|
154 | PrefilterFrontEnd.execute(self, python_string, raw_string=raw_string) | |||
|
155 | ||||
|
156 | ||||
|
157 | def capture_output(self): | |||
154 | self.__old_raw_input = __builtin__.raw_input |
|
158 | self.__old_raw_input = __builtin__.raw_input | |
155 | __builtin__.raw_input = self.raw_input |
|
159 | __builtin__.raw_input = self.raw_input | |
156 | PrefilterFrontEnd.execute(self, python_string, raw_string=raw_string) |
|
160 | PrefilterFrontEnd.capture_output(self) | |
|
161 | ||||
|
162 | ||||
|
163 | def release_output(self): | |||
157 | __builtin__.raw_input = self.__old_raw_input |
|
164 | __builtin__.raw_input = self.__old_raw_input | |
|
165 | PrefilterFrontEnd.capture_output(self) | |||
158 |
|
166 | |||
159 |
|
167 | |||
160 | def after_execute(self): |
|
168 | def after_execute(self): |
@@ -734,7 +734,7 b' class InteractiveShell(object,Magic):' | |||||
734 | batchrun = True |
|
734 | batchrun = True | |
735 | # without -i option, exit after running the batch file |
|
735 | # without -i option, exit after running the batch file | |
736 | if batchrun and not self.rc.interact: |
|
736 | if batchrun and not self.rc.interact: | |
737 |
self. |
|
737 | self.ask_exit() | |
738 |
|
738 | |||
739 | def add_builtins(self): |
|
739 | def add_builtins(self): | |
740 | """Store ipython references into the builtin namespace. |
|
740 | """Store ipython references into the builtin namespace. | |
@@ -1590,7 +1590,7 b' want to merge them back into the new files.""" % locals()' | |||||
1590 | #sys.argv = ['-c'] |
|
1590 | #sys.argv = ['-c'] | |
1591 | self.push(self.prefilter(self.rc.c, False)) |
|
1591 | self.push(self.prefilter(self.rc.c, False)) | |
1592 | if not self.rc.interact: |
|
1592 | if not self.rc.interact: | |
1593 |
self. |
|
1593 | self.ask_exit() | |
1594 |
|
1594 | |||
1595 | def embed_mainloop(self,header='',local_ns=None,global_ns=None,stack_depth=0): |
|
1595 | def embed_mainloop(self,header='',local_ns=None,global_ns=None,stack_depth=0): | |
1596 | """Embeds IPython into a running python program. |
|
1596 | """Embeds IPython into a running python program. | |
@@ -1752,7 +1752,8 b' want to merge them back into the new files.""" % locals()' | |||||
1752 |
|
1752 | |||
1753 | if self.has_readline: |
|
1753 | if self.has_readline: | |
1754 | self.readline_startup_hook(self.pre_readline) |
|
1754 | self.readline_startup_hook(self.pre_readline) | |
1755 | # exit_now is set by a call to %Exit or %Quit |
|
1755 | # exit_now is set by a call to %Exit or %Quit, through the | |
|
1756 | # ask_exit callback. | |||
1756 |
|
1757 | |||
1757 | while not self.exit_now: |
|
1758 | while not self.exit_now: | |
1758 | self.hooks.pre_prompt_hook() |
|
1759 | self.hooks.pre_prompt_hook() | |
@@ -2157,7 +2158,7 b' want to merge them back into the new files.""" % locals()' | |||||
2157 | except ValueError: |
|
2158 | except ValueError: | |
2158 | warn("\n********\nYou or a %run:ed script called sys.stdin.close()" |
|
2159 | warn("\n********\nYou or a %run:ed script called sys.stdin.close()" | |
2159 | " or sys.stdout.close()!\nExiting IPython!") |
|
2160 | " or sys.stdout.close()!\nExiting IPython!") | |
2160 |
self. |
|
2161 | self.ask_exit() | |
2161 | return "" |
|
2162 | return "" | |
2162 |
|
2163 | |||
2163 | # Try to be reasonably smart about not re-indenting pasted input more |
|
2164 | # Try to be reasonably smart about not re-indenting pasted input more | |
@@ -2507,16 +2508,20 b' want to merge them back into the new files.""" % locals()' | |||||
2507 | """Write a string to the default error output""" |
|
2508 | """Write a string to the default error output""" | |
2508 | Term.cerr.write(data) |
|
2509 | Term.cerr.write(data) | |
2509 |
|
2510 | |||
|
2511 | def ask_exit(self): | |||
|
2512 | """ Call for exiting. Can be overiden and used as a callback. """ | |||
|
2513 | self.exit_now = True | |||
|
2514 | ||||
2510 | def exit(self): |
|
2515 | def exit(self): | |
2511 | """Handle interactive exit. |
|
2516 | """Handle interactive exit. | |
2512 |
|
2517 | |||
2513 |
This method |
|
2518 | This method calls the ask_exit callback.""" | |
2514 |
|
2519 | |||
2515 | if self.rc.confirm_exit: |
|
2520 | if self.rc.confirm_exit: | |
2516 | if self.ask_yes_no('Do you really want to exit ([y]/n)?','y'): |
|
2521 | if self.ask_yes_no('Do you really want to exit ([y]/n)?','y'): | |
2517 |
self. |
|
2522 | self.ask_exit() | |
2518 | else: |
|
2523 | else: | |
2519 |
self. |
|
2524 | self.ask_exit() | |
2520 |
|
2525 | |||
2521 | def safe_execfile(self,fname,*where,**kw): |
|
2526 | def safe_execfile(self,fname,*where,**kw): | |
2522 | """A safe version of the builtin execfile(). |
|
2527 | """A safe version of the builtin execfile(). |
General Comments 0
You need to be logged in to leave comments.
Login now