0
0
mirror of https://github.com/python/cpython.git synced 2024-12-01 03:01:36 +01:00
cpython/Tools/idle/ScriptBinding.py
Guido van Rossum 1f3de5d7b9 Mostly rewritten. Instead of the old Run module and Debug module,
there are two new commands:

Import module (F5) imports or reloads the module and also adds its
name to the __main__ namespace.  This gets executed in the PyShell
window under control of its debug settings.

Run script (Control-F5) is similar but executes the contents of the
file directly in the __main__ namespace.
1999-04-22 22:27:40 +00:00

94 lines
2.8 KiB
Python

"""Extension to execute code outside the Python shell window.
This adds two commands (to the Edit menu, until there's a separate
Python menu):
- Import module (F5) is equivalent to either import or reload of the
current module. The window must have been saved previously. The
module is added to sys.modules, and is also added to the __main__
namespace. Output goes to the shell window.
- Run module (Control-F5) does the same but executes the module's
code in the __main__ namespace.
"""
import sys
import os
import imp
import tkMessageBox
class ScriptBinding:
keydefs = {
'<<import-module>>': ['<F5>'],
'<<run-script>>': ['<Control-F5>'],
}
menudefs = [
('edit', [None,
('Import module', '<<import-module>>'),
('Run script', '<<run-script>>'),
]
),
]
def __init__(self, editwin):
self.editwin = editwin
# Provide instance variables referenced by Debugger
# XXX This should be done differently
self.flist = self.editwin.flist
self.root = self.flist.root
def import_module_event(self, event):
filename = self.getfilename()
if not filename:
return
modname, ext = os.path.splitext(os.path.basename(filename))
if sys.modules.has_key(modname):
mod = sys.modules[modname]
else:
mod = imp.new_module(modname)
sys.modules[modname] = mod
mod.__file__ = filename
setattr(sys.modules['__main__'], modname, mod)
dir = os.path.dirname(filename)
dir = os.path.normpath(os.path.abspath(dir))
if dir not in sys.path:
sys.path.insert(0, dir)
flist = self.editwin.flist
shell = flist.open_shell()
interp = shell.interp
interp.runcode("reload(%s)" % modname)
def run_script_event(self, event):
filename = self.getfilename()
if not filename:
return
flist = self.editwin.flist
shell = flist.open_shell()
interp = shell.interp
interp.execfile(filename)
def getfilename(self):
# Logic to make sure we have a saved filename
if not self.editwin.get_saved():
tkMessageBox.showerror("Not saved",
"Please save first!",
master=self.editwin.text)
self.editwin.text.focus_set()
return
filename = self.editwin.io.filename
if not filename:
tkMessageBox.showerror("No file name",
"This window has no file name",
master=self.editwin.text)
self.editwin.text.focus_set()
return
return filename