Mercurial > repos > rliterman > csp2
comparison CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/lib/python3.8/idlelib/window.py @ 68:5028fdace37b
planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author | jpayne |
---|---|
date | Tue, 18 Mar 2025 16:23:26 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
67:0e9998148a16 | 68:5028fdace37b |
---|---|
1 from tkinter import Toplevel, TclError | |
2 import sys | |
3 | |
4 | |
5 class WindowList: | |
6 | |
7 def __init__(self): | |
8 self.dict = {} | |
9 self.callbacks = [] | |
10 | |
11 def add(self, window): | |
12 window.after_idle(self.call_callbacks) | |
13 self.dict[str(window)] = window | |
14 | |
15 def delete(self, window): | |
16 try: | |
17 del self.dict[str(window)] | |
18 except KeyError: | |
19 # Sometimes, destroy() is called twice | |
20 pass | |
21 self.call_callbacks() | |
22 | |
23 def add_windows_to_menu(self, menu): | |
24 list = [] | |
25 for key in self.dict: | |
26 window = self.dict[key] | |
27 try: | |
28 title = window.get_title() | |
29 except TclError: | |
30 continue | |
31 list.append((title, key, window)) | |
32 list.sort() | |
33 for title, key, window in list: | |
34 menu.add_command(label=title, command=window.wakeup) | |
35 | |
36 def register_callback(self, callback): | |
37 self.callbacks.append(callback) | |
38 | |
39 def unregister_callback(self, callback): | |
40 try: | |
41 self.callbacks.remove(callback) | |
42 except ValueError: | |
43 pass | |
44 | |
45 def call_callbacks(self): | |
46 for callback in self.callbacks: | |
47 try: | |
48 callback() | |
49 except: | |
50 t, v, tb = sys.exc_info() | |
51 print("warning: callback failed in WindowList", t, ":", v) | |
52 | |
53 | |
54 registry = WindowList() | |
55 | |
56 add_windows_to_menu = registry.add_windows_to_menu | |
57 register_callback = registry.register_callback | |
58 unregister_callback = registry.unregister_callback | |
59 | |
60 | |
61 class ListedToplevel(Toplevel): | |
62 | |
63 def __init__(self, master, **kw): | |
64 Toplevel.__init__(self, master, kw) | |
65 registry.add(self) | |
66 self.focused_widget = self | |
67 | |
68 def destroy(self): | |
69 registry.delete(self) | |
70 Toplevel.destroy(self) | |
71 # If this is Idle's last window then quit the mainloop | |
72 # (Needed for clean exit on Windows 98) | |
73 if not registry.dict: | |
74 self.quit() | |
75 | |
76 def update_windowlist_registry(self, window): | |
77 registry.call_callbacks() | |
78 | |
79 def get_title(self): | |
80 # Subclass can override | |
81 return self.wm_title() | |
82 | |
83 def wakeup(self): | |
84 try: | |
85 if self.wm_state() == "iconic": | |
86 self.wm_withdraw() | |
87 self.wm_deiconify() | |
88 self.tkraise() | |
89 self.focused_widget.focus_set() | |
90 except TclError: | |
91 # This can happen when the Window menu was torn off. | |
92 # Simply ignore it. | |
93 pass | |
94 | |
95 | |
96 if __name__ == "__main__": | |
97 from unittest import main | |
98 main('idlelib.idle_test.test_window', verbosity=2) |