blob: 94a248f451e5146b1ab6781c9868a4a930034cbb [file] [log] [blame]
Guido van Rossum9f425841999-01-09 05:00:17 +00001"""Extension to execute code outside the Python shell window.
2
3This adds two commands (to the Edit menu, until there's a separate
4Python menu):
5
Guido van Rossum1f3de5d1999-04-22 22:27:40 +00006- Import module (F5) is equivalent to either import or reload of the
Guido van Rossum9f425841999-01-09 05:00:17 +00007current module. The window must have been saved previously. The
Guido van Rossum1f3de5d1999-04-22 22:27:40 +00008module is added to sys.modules, and is also added to the __main__
9namespace. Output goes to the shell window.
Guido van Rossum9f425841999-01-09 05:00:17 +000010
Guido van Rossum1f3de5d1999-04-22 22:27:40 +000011- Run module (Control-F5) does the same but executes the module's
12code in the __main__ namespace.
Guido van Rossum9f425841999-01-09 05:00:17 +000013
14"""
15
16import sys
Guido van Rossum504b0bf1999-01-02 21:28:54 +000017import os
18import imp
Guido van Rossum9f425841999-01-09 05:00:17 +000019import tkMessageBox
Guido van Rossum825df2a1999-03-29 14:52:28 +000020
Guido van Rossum504b0bf1999-01-02 21:28:54 +000021
22class ScriptBinding:
Guido van Rossum9f425841999-01-09 05:00:17 +000023
24 keydefs = {
Guido van Rossum1f3de5d1999-04-22 22:27:40 +000025 '<<import-module>>': ['<F5>'],
26 '<<run-script>>': ['<Control-F5>'],
Guido van Rossum9f425841999-01-09 05:00:17 +000027 }
28
29 menudefs = [
30 ('edit', [None,
Guido van Rossum1f3de5d1999-04-22 22:27:40 +000031 ('Import module', '<<import-module>>'),
32 ('Run script', '<<run-script>>'),
Guido van Rossum9f425841999-01-09 05:00:17 +000033 ]
34 ),
35 ]
Guido van Rossum504b0bf1999-01-02 21:28:54 +000036
37 def __init__(self, editwin):
38 self.editwin = editwin
Guido van Rossum9f425841999-01-09 05:00:17 +000039 # Provide instance variables referenced by Debugger
40 # XXX This should be done differently
41 self.flist = self.editwin.flist
42 self.root = self.flist.root
Guido van Rossum504b0bf1999-01-02 21:28:54 +000043
Guido van Rossum1f3de5d1999-04-22 22:27:40 +000044 def import_module_event(self, event):
45 filename = self.getfilename()
46 if not filename:
47 return
48
49 modname, ext = os.path.splitext(os.path.basename(filename))
50 if sys.modules.has_key(modname):
51 mod = sys.modules[modname]
52 else:
53 mod = imp.new_module(modname)
54 sys.modules[modname] = mod
55 mod.__file__ = filename
56 setattr(sys.modules['__main__'], modname, mod)
57
58 dir = os.path.dirname(filename)
59 dir = os.path.normpath(os.path.abspath(dir))
60 if dir not in sys.path:
61 sys.path.insert(0, dir)
62
63 flist = self.editwin.flist
64 shell = flist.open_shell()
65 interp = shell.interp
66 interp.runcode("reload(%s)" % modname)
67
68 def run_script_event(self, event):
69 filename = self.getfilename()
70 if not filename:
71 return
72
73 flist = self.editwin.flist
74 shell = flist.open_shell()
75 interp = shell.interp
76 interp.execfile(filename)
77
78 def getfilename(self):
79 # Logic to make sure we have a saved filename
Guido van Rossum9f425841999-01-09 05:00:17 +000080 if not self.editwin.get_saved():
81 tkMessageBox.showerror("Not saved",
82 "Please save first!",
83 master=self.editwin.text)
84 self.editwin.text.focus_set()
85 return
Guido van Rossum504b0bf1999-01-02 21:28:54 +000086 filename = self.editwin.io.filename
87 if not filename:
88 tkMessageBox.showerror("No file name",
89 "This window has no file name",
90 master=self.editwin.text)
Guido van Rossum9f425841999-01-09 05:00:17 +000091 self.editwin.text.focus_set()
Guido van Rossum504b0bf1999-01-02 21:28:54 +000092 return
Guido van Rossum1f3de5d1999-04-22 22:27:40 +000093 return filename