annotate Lib/idlelib/WindowList.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 560b2f52952c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
47130
ef4cca2d6171 Tkinter, step 2: adapt imports.
Georg Brandl <georg@python.org>
parents: 42725
diff changeset
1 from tkinter import *
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
2
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
3 class WindowList:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
4
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
5 def __init__(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
6 self.dict = {}
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
7 self.callbacks = []
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
8
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
9 def add(self, window):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
10 window.after_idle(self.call_callbacks)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
11 self.dict[str(window)] = window
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
12
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
13 def delete(self, window):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
14 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
15 del self.dict[str(window)]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
16 except KeyError:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
17 # Sometimes, destroy() is called twice
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
18 pass
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
19 self.call_callbacks()
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 add_windows_to_menu(self, menu):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
22 list = []
42725
fa9a40ef0780 Conform to py3k dict.{keys, items, values} with some advice from 2b3
Kurt B. Kaiser <kbk@shore.net>
parents: 40775
diff changeset
23 for key in self.dict:
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
24 window = self.dict[key]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
25 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
26 title = window.get_title()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
27 except TclError:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
28 continue
49887
560b2f52952c #4455: IDLE failed to display the windows list when two windows have the same title.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47130
diff changeset
29 list.append((title, key, window))
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
30 list.sort()
49887
560b2f52952c #4455: IDLE failed to display the windows list when two windows have the same title.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47130
diff changeset
31 for title, key, window in list:
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
32 menu.add_command(label=title, command=window.wakeup)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
33
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
34 def register_callback(self, callback):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
35 self.callbacks.append(callback)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
36
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
37 def unregister_callback(self, callback):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
38 try:
18495
c4f75857502a py-cvs merge, correct indentation
Steven M. Gava <elguavas@python.net>
parents: 13975
diff changeset
39 self.callbacks.remove(callback)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
40 except ValueError:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
41 pass
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
42
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
43 def call_callbacks(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
44 for callback in self.callbacks:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
45 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
46 callback()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
47 except:
37811
6d8e3e65947f Fix two errors that prevented "make libinstall" from working:
Guido van Rossum <guido@python.org>
parents: 37042
diff changeset
48 t, v, tb = sys.exc_info()
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 37811
diff changeset
49 print("warning: callback failed in WindowList", t, ":", v)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
50
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
51 registry = WindowList()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
52
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
53 add_windows_to_menu = registry.add_windows_to_menu
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
54 register_callback = registry.register_callback
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
55 unregister_callback = registry.unregister_callback
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
56
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
57
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
58 class ListedToplevel(Toplevel):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
59
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
60 def __init__(self, master, **kw):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
61 Toplevel.__init__(self, master, kw)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
62 registry.add(self)
33218
066c7890cd61 1. If user passes a non-existant filename on the commandline, just open
Kurt B. Kaiser <kbk@shore.net>
parents: 29367
diff changeset
63 self.focused_widget = self
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
64
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
65 def destroy(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
66 registry.delete(self)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
67 Toplevel.destroy(self)
25571
c85d7cdd983f Josh Robb's Patch
Kurt B. Kaiser <kbk@shore.net>
parents: 18495
diff changeset
68 # If this is Idle's last window then quit the mainloop
c85d7cdd983f Josh Robb's Patch
Kurt B. Kaiser <kbk@shore.net>
parents: 18495
diff changeset
69 # (Needed for clean exit on Windows 98)
c85d7cdd983f Josh Robb's Patch
Kurt B. Kaiser <kbk@shore.net>
parents: 18495
diff changeset
70 if not registry.dict:
c85d7cdd983f Josh Robb's Patch
Kurt B. Kaiser <kbk@shore.net>
parents: 18495
diff changeset
71 self.quit()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
72
29367
ca20c3cbc956 1. Update WindowList registry when filename changes so that
Kurt B. Kaiser <kbk@shore.net>
parents: 25571
diff changeset
73 def update_windowlist_registry(self, window):
ca20c3cbc956 1. Update WindowList registry when filename changes so that
Kurt B. Kaiser <kbk@shore.net>
parents: 25571
diff changeset
74 registry.call_callbacks()
ca20c3cbc956 1. Update WindowList registry when filename changes so that
Kurt B. Kaiser <kbk@shore.net>
parents: 25571
diff changeset
75
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
76 def get_title(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
77 # Subclass can override
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
78 return self.wm_title()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
79
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
80 def wakeup(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
81 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
82 if self.wm_state() == "iconic":
33218
066c7890cd61 1. If user passes a non-existant filename on the commandline, just open
Kurt B. Kaiser <kbk@shore.net>
parents: 29367
diff changeset
83 self.wm_withdraw()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
84 self.wm_deiconify()
33218
066c7890cd61 1. If user passes a non-existant filename on the commandline, just open
Kurt B. Kaiser <kbk@shore.net>
parents: 29367
diff changeset
85 self.tkraise()
066c7890cd61 1. If user passes a non-existant filename on the commandline, just open
Kurt B. Kaiser <kbk@shore.net>
parents: 29367
diff changeset
86 self.focused_widget.focus_set()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
87 except TclError:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
88 # This can happen when the window menu was torn off.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
89 # Simply ignore it.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
90 pass