annotate Lib/idlelib/OutputWindow.py @ 80661:94de77bd0b4b 2.7

Issue #16194: document imp.load_dynamic problems when read several extension modules from the same binary object file.
author Andrew Svetlov <andrew.svetlov@gmail.com>
date Thu, 29 Nov 2012 19:51:28 +0200
parents 639dd6e62de4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
47183
b53604fad54b Tkinter rename reversal: remove tkinter package, adapt imports and docs.
Georg Brandl <georg@python.org>
parents: 47101
diff changeset
1 from Tkinter import *
63585
df378e44ba9a Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 56387
diff changeset
2 from idlelib.EditorWindow import EditorWindow
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
3 import re
47183
b53604fad54b Tkinter rename reversal: remove tkinter package, adapt imports and docs.
Georg Brandl <georg@python.org>
parents: 47101
diff changeset
4 import tkMessageBox
63585
df378e44ba9a Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 56387
diff changeset
5 from idlelib import IOBinding
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
6
23784
24b0f6d693e3 Rework the code to have only the GvR RPC. Output from execution of user
Kurt B. Kaiser <kbk@shore.net>
parents: 22012
diff changeset
7 class OutputWindow(EditorWindow):
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
8
23784
24b0f6d693e3 Rework the code to have only the GvR RPC. Output from execution of user
Kurt B. Kaiser <kbk@shore.net>
parents: 22012
diff changeset
9 """An editor window that can serve as an output file.
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
10
23784
24b0f6d693e3 Rework the code to have only the GvR RPC. Output from execution of user
Kurt B. Kaiser <kbk@shore.net>
parents: 22012
diff changeset
11 Also the future base class for the Python shell window.
24b0f6d693e3 Rework the code to have only the GvR RPC. Output from execution of user
Kurt B. Kaiser <kbk@shore.net>
parents: 22012
diff changeset
12 This class has no input facilities.
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
13 """
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
14
23784
24b0f6d693e3 Rework the code to have only the GvR RPC. Output from execution of user
Kurt B. Kaiser <kbk@shore.net>
parents: 22012
diff changeset
15 def __init__(self, *args):
29794
94e5d1b8f696 SF patch #768187: replace apply(f, args, kwds) with f(*args, **kwds)
Raymond Hettinger <python@rcn.com>
parents: 29477
diff changeset
16 EditorWindow.__init__(self, *args)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
17 self.text.bind("<<goto-file-line>>", self.goto_file_line)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
18
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
19 # Customize EditorWindow
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
20
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
21 def ispythonsource(self, filename):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
22 # No colorization needed
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
23 return 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
24
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
25 def short_title(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
26 return "Output"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
27
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
28 def maybesave(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
29 # Override base class method -- don't ask any questions
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
30 if self.get_saved():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
31 return "yes"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
32 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
33 return "no"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
34
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
35 # Act as output file
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
36
23784
24b0f6d693e3 Rework the code to have only the GvR RPC. Output from execution of user
Kurt B. Kaiser <kbk@shore.net>
parents: 22012
diff changeset
37 def write(self, s, tags=(), mark="insert"):
29477
892dfc9e7256 Forwardport Patch from IDLEfork SF 615312
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
38 # Tk assumes that byte strings are Latin-1;
892dfc9e7256 Forwardport Patch from IDLEfork SF 615312
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
39 # we assume that they are in the locale's encoding
892dfc9e7256 Forwardport Patch from IDLEfork SF 615312
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
40 if isinstance(s, str):
892dfc9e7256 Forwardport Patch from IDLEfork SF 615312
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
41 try:
892dfc9e7256 Forwardport Patch from IDLEfork SF 615312
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
42 s = unicode(s, IOBinding.encoding)
892dfc9e7256 Forwardport Patch from IDLEfork SF 615312
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
43 except UnicodeError:
892dfc9e7256 Forwardport Patch from IDLEfork SF 615312
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
44 # some other encoding; let Tcl deal with it
892dfc9e7256 Forwardport Patch from IDLEfork SF 615312
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
45 pass
25096
98ddc4297f36 (Re)Apply Sourceforge Python patch 520483, Sourceforge Idlefork patch
Kurt B. Kaiser <kbk@shore.net>
parents: 23784
diff changeset
46 self.text.insert(mark, s, tags)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
47 self.text.see(mark)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
48 self.text.update()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
49
63585
df378e44ba9a Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 56387
diff changeset
50 def writelines(self, lines):
df378e44ba9a Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 56387
diff changeset
51 for line in lines:
df378e44ba9a Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 56387
diff changeset
52 self.write(line)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
53
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
54 def flush(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
55 pass
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
56
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
57 # Our own right-button menu
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
58
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
59 rmenu_specs = [
80172
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 68256
diff changeset
60 ("Cut", "<<cut>>", "rmenu_check_cut"),
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 68256
diff changeset
61 ("Copy", "<<copy>>", "rmenu_check_copy"),
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 68256
diff changeset
62 ("Paste", "<<paste>>", "rmenu_check_paste"),
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 68256
diff changeset
63 (None, None, None),
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 68256
diff changeset
64 ("Go to file/line", "<<goto-file-line>>", None),
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
65 ]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
66
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
67 file_line_pats = [
56387
490190cb4a57 Merged revisions 71995,72227 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 47183
diff changeset
68 # order of patterns matters
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
69 r'file "([^"]*)", line (\d+)',
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
70 r'([^\s]+)\((\d+)\)',
56387
490190cb4a57 Merged revisions 71995,72227 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 47183
diff changeset
71 r'^(\s*\S.*?):\s*(\d+):', # Win filename, maybe starting with spaces
490190cb4a57 Merged revisions 71995,72227 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 47183
diff changeset
72 r'([^\s]+):\s*(\d+):', # filename or path, ltrim
490190cb4a57 Merged revisions 71995,72227 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 47183
diff changeset
73 r'^\s*(\S.*?):\s*(\d+):', # Win abs path with embedded spaces, ltrim
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
74 ]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
75
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
76 file_line_progs = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
77
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
78 def goto_file_line(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
79 if self.file_line_progs is None:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
80 l = []
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
81 for pat in self.file_line_pats:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
82 l.append(re.compile(pat, re.IGNORECASE))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
83 self.file_line_progs = l
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
84 # x, y = self.event.x, self.event.y
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
85 # self.text.mark_set("insert", "@%d,%d" % (x, y))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
86 line = self.text.get("insert linestart", "insert lineend")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
87 result = self._file_line_helper(line)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
88 if not result:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
89 # Try the previous line. This is handy e.g. in tracebacks,
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
90 # where you tend to right-click on the displayed source line
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
91 line = self.text.get("insert -1line linestart",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
92 "insert -1line lineend")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
93 result = self._file_line_helper(line)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
94 if not result:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
95 tkMessageBox.showerror(
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
96 "No special line",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
97 "The line you point at doesn't look like "
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
98 "a valid file name followed by a line number.",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
99 master=self.text)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
100 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
101 filename, lineno = result
23784
24b0f6d693e3 Rework the code to have only the GvR RPC. Output from execution of user
Kurt B. Kaiser <kbk@shore.net>
parents: 22012
diff changeset
102 edit = self.flist.open(filename)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
103 edit.gotoline(lineno)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
104
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
105 def _file_line_helper(self, line):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
106 for prog in self.file_line_progs:
56387
490190cb4a57 Merged revisions 71995,72227 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 47183
diff changeset
107 match = prog.search(line)
490190cb4a57 Merged revisions 71995,72227 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 47183
diff changeset
108 if match:
490190cb4a57 Merged revisions 71995,72227 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 47183
diff changeset
109 filename, lineno = match.group(1, 2)
490190cb4a57 Merged revisions 71995,72227 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 47183
diff changeset
110 try:
490190cb4a57 Merged revisions 71995,72227 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 47183
diff changeset
111 f = open(filename, "r")
490190cb4a57 Merged revisions 71995,72227 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 47183
diff changeset
112 f.close()
490190cb4a57 Merged revisions 71995,72227 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 47183
diff changeset
113 break
490190cb4a57 Merged revisions 71995,72227 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 47183
diff changeset
114 except IOError:
490190cb4a57 Merged revisions 71995,72227 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 47183
diff changeset
115 continue
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
116 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
117 return None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
118 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
119 return filename, int(lineno)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
120 except TypeError:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
121 return None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
122
23784
24b0f6d693e3 Rework the code to have only the GvR RPC. Output from execution of user
Kurt B. Kaiser <kbk@shore.net>
parents: 22012
diff changeset
123 # These classes are currently not used but might come in handy
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
124
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
125 class OnDemandOutputWindow:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
126
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
127 tagdefs = {
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
128 # XXX Should use IdlePrefs.ColorPrefs
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
129 "stdout": {"foreground": "blue"},
23784
24b0f6d693e3 Rework the code to have only the GvR RPC. Output from execution of user
Kurt B. Kaiser <kbk@shore.net>
parents: 22012
diff changeset
130 "stderr": {"foreground": "#007700"},
24b0f6d693e3 Rework the code to have only the GvR RPC. Output from execution of user
Kurt B. Kaiser <kbk@shore.net>
parents: 22012
diff changeset
131 }
24b0f6d693e3 Rework the code to have only the GvR RPC. Output from execution of user
Kurt B. Kaiser <kbk@shore.net>
parents: 22012
diff changeset
132
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
133 def __init__(self, flist):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
134 self.flist = flist
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
135 self.owin = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
136
23784
24b0f6d693e3 Rework the code to have only the GvR RPC. Output from execution of user
Kurt B. Kaiser <kbk@shore.net>
parents: 22012
diff changeset
137 def write(self, s, tags, mark):
24b0f6d693e3 Rework the code to have only the GvR RPC. Output from execution of user
Kurt B. Kaiser <kbk@shore.net>
parents: 22012
diff changeset
138 if not self.owin:
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
139 self.setup()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
140 self.owin.write(s, tags, mark)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
141
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
142 def setup(self):
23784
24b0f6d693e3 Rework the code to have only the GvR RPC. Output from execution of user
Kurt B. Kaiser <kbk@shore.net>
parents: 22012
diff changeset
143 self.owin = owin = OutputWindow(self.flist)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
144 text = owin.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
145 for tag, cnf in self.tagdefs.items():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
146 if cnf:
29794
94e5d1b8f696 SF patch #768187: replace apply(f, args, kwds) with f(*args, **kwds)
Raymond Hettinger <python@rcn.com>
parents: 29477
diff changeset
147 text.tag_configure(tag, **cnf)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
148 text.tag_raise('sel')
23784
24b0f6d693e3 Rework the code to have only the GvR RPC. Output from execution of user
Kurt B. Kaiser <kbk@shore.net>
parents: 22012
diff changeset
149 self.write = self.owin.write