Subsume functionality from Popup menu in Debug menu.
Other stuff so the PyShell window can be resurrected from the Windows menu.
This commit is contained in:
parent
82e44b10b8
commit
5af7a72d8b
|
@ -3,6 +3,7 @@
|
|||
import os
|
||||
import sys
|
||||
import string
|
||||
import re
|
||||
|
||||
import linecache
|
||||
from code import InteractiveInterpreter
|
||||
|
@ -15,6 +16,27 @@ from FileList import FileList, MultiEditorWindow, MultiIOBinding
|
|||
from ColorDelegator import ColorDelegator
|
||||
|
||||
|
||||
class PyShellEditorWindow(MultiEditorWindow):
|
||||
|
||||
def fixedwindowsmenu(self, wmenu):
|
||||
wmenu.add_command(label="Python Shell", command=self.flist.open_shell)
|
||||
|
||||
|
||||
class PyShellFileList(FileList):
|
||||
|
||||
EditorWindow = PyShellEditorWindow
|
||||
|
||||
pyshell = None
|
||||
|
||||
def open_shell(self):
|
||||
if self.pyshell:
|
||||
self.pyshell.wakeup()
|
||||
else:
|
||||
self.pyshell = PyShell(self)
|
||||
self.pyshell.begin()
|
||||
return self.pyshell
|
||||
|
||||
|
||||
class ModifiedIOBinding(MultiIOBinding):
|
||||
|
||||
def defaultfilename(self, mode="open"):
|
||||
|
@ -134,12 +156,16 @@ class ModifiedInterpreter(InteractiveInterpreter):
|
|||
self.tkconsole.console.write(s)
|
||||
|
||||
|
||||
class PyShell(MultiEditorWindow):
|
||||
class PyShell(PyShellEditorWindow):
|
||||
|
||||
# Override classes
|
||||
ColorDelegator = ModifiedColorDelegator
|
||||
IOBinding = ModifiedIOBinding
|
||||
|
||||
# Override menu bar specs
|
||||
menu_specs = PyShellEditorWindow.menu_specs[:]
|
||||
menu_specs.insert(len(menu_specs)-1, ("debug", "Debug"))
|
||||
|
||||
# New class
|
||||
from History import History
|
||||
|
||||
|
@ -149,9 +175,9 @@ class PyShell(MultiEditorWindow):
|
|||
root = Tk()
|
||||
fixwordbreaks(root)
|
||||
root.withdraw()
|
||||
flist = FileList(root)
|
||||
flist = PyShellFileList(root)
|
||||
|
||||
MultiEditorWindow.__init__(self, flist, None, None)
|
||||
PyShellEditorWindow.__init__(self, flist, None, None)
|
||||
self.config_colors()
|
||||
|
||||
import __builtin__
|
||||
|
@ -165,6 +191,8 @@ class PyShell(MultiEditorWindow):
|
|||
text.bind("<<interrupt-execution>>", self.cancel_callback)
|
||||
text.bind("<<beginning-of-line>>", self.home_callback)
|
||||
text.bind("<<end-of-file>>", self.eof_callback)
|
||||
text.bind("<<goto-traceback-line>>", self.goto_traceback_line)
|
||||
text.bind("<<open-stack-viewer>>", self.open_stack_viewer)
|
||||
|
||||
sys.stdout = PseudoFile(self, "stdout")
|
||||
##sys.stderr = PseudoFile(self, "stderr")
|
||||
|
@ -222,8 +250,9 @@ class PyShell(MultiEditorWindow):
|
|||
if self.reading:
|
||||
self.top.quit()
|
||||
return "cancel"
|
||||
reply = MultiEditorWindow.close(self)
|
||||
reply = PyShellEditorWindow.close(self)
|
||||
if reply != "cancel":
|
||||
self.flist.pyshell = None
|
||||
# Restore std streams
|
||||
sys.stdout = sys.__stdout__
|
||||
sys.stderr = sys.__stderr__
|
||||
|
@ -246,7 +275,7 @@ class PyShell(MultiEditorWindow):
|
|||
title = title + " *"
|
||||
self.top.wm_title(title)
|
||||
|
||||
def interact(self):
|
||||
def begin(self):
|
||||
self.resetoutput()
|
||||
self.write("Python %s on %s\n%s\n" %
|
||||
(sys.version, sys.platform, sys.copyright))
|
||||
|
@ -257,6 +286,9 @@ class PyShell(MultiEditorWindow):
|
|||
self.showprompt()
|
||||
import Tkinter
|
||||
Tkinter._default_root = None
|
||||
|
||||
def interact(self):
|
||||
self.begin()
|
||||
self.top.mainloop()
|
||||
|
||||
def readline(self):
|
||||
|
@ -416,6 +448,60 @@ class PyShell(MultiEditorWindow):
|
|||
raise KeyboardInterrupt
|
||||
return self._cancel_check
|
||||
|
||||
file_line_pats = [
|
||||
r'File "([^"]*)", line (\d+)',
|
||||
r'([^\s]+)\((\d+)\)',
|
||||
r'([^\s]+):\s*(\d+):',
|
||||
]
|
||||
|
||||
file_line_progs = None
|
||||
|
||||
def goto_traceback_line(self, event=None):
|
||||
if self.file_line_progs is None:
|
||||
l = []
|
||||
for pat in self.file_line_pats:
|
||||
l.append(re.compile(pat))
|
||||
self.file_line_progs = l
|
||||
# x, y = self.event.x, self.event.y
|
||||
# self.text.mark_set("insert", "@%d,%d" % (x, y))
|
||||
line = self.text.get("insert linestart", "insert lineend")
|
||||
for prog in self.file_line_progs:
|
||||
m = prog.search(line)
|
||||
if m:
|
||||
break
|
||||
else:
|
||||
tkMessageBox.showerror("No traceback line",
|
||||
"The line you point at doesn't look "
|
||||
"like an error message.",
|
||||
master=self.text)
|
||||
return
|
||||
filename, lineno = m.group(1, 2)
|
||||
try:
|
||||
f = open(filename, "r")
|
||||
f.close()
|
||||
except IOError, msg:
|
||||
self.text.bell()
|
||||
return
|
||||
edit = self.flist.open(filename)
|
||||
try:
|
||||
lineno = int(lineno)
|
||||
except ValueError, msg:
|
||||
self.text.bell()
|
||||
return
|
||||
edit.gotoline(lineno)
|
||||
|
||||
def open_stack_viewer(self, event=None):
|
||||
try:
|
||||
sys.last_traceback
|
||||
except:
|
||||
tkMessageBox.showerror("No stack trace",
|
||||
"There is no stack trace yet.\n"
|
||||
"(sys.last_traceback is not defined)",
|
||||
master=self.text)
|
||||
return
|
||||
from StackViewer import StackViewer
|
||||
sv = StackViewer(self.root, self.flist)
|
||||
|
||||
def showprompt(self):
|
||||
self.resetoutput()
|
||||
try:
|
||||
|
@ -464,12 +550,14 @@ def main():
|
|||
root = Tk()
|
||||
fixwordbreaks(root)
|
||||
root.withdraw()
|
||||
flist = FileList(root)
|
||||
flist = PyShellFileList(root)
|
||||
if sys.argv[1:]:
|
||||
for filename in sys.argv[1:]:
|
||||
flist.open(filename)
|
||||
t = PyShell(flist)
|
||||
t.interact()
|
||||
flist.pyshell = t
|
||||
t.begin()
|
||||
root.mainloop()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
|
Loading…
Reference in New Issue