| 1 | n/a | from tkinter import * | 
|---|
| 2 | n/a |  | 
|---|
| 3 | n/a | class WindowList: | 
|---|
| 4 | n/a |  | 
|---|
| 5 | n/a |     def __init__(self): | 
|---|
| 6 | n/a |         self.dict = {} | 
|---|
| 7 | n/a |         self.callbacks = [] | 
|---|
| 8 | n/a |  | 
|---|
| 9 | n/a |     def add(self, window): | 
|---|
| 10 | n/a |         window.after_idle(self.call_callbacks) | 
|---|
| 11 | n/a |         self.dict[str(window)] = window | 
|---|
| 12 | n/a |  | 
|---|
| 13 | n/a |     def delete(self, window): | 
|---|
| 14 | n/a |         try: | 
|---|
| 15 | n/a |             del self.dict[str(window)] | 
|---|
| 16 | n/a |         except KeyError: | 
|---|
| 17 | n/a |             # Sometimes, destroy() is called twice | 
|---|
| 18 | n/a |             pass | 
|---|
| 19 | n/a |         self.call_callbacks() | 
|---|
| 20 | n/a |  | 
|---|
| 21 | n/a |     def add_windows_to_menu(self,  menu): | 
|---|
| 22 | n/a |         list = [] | 
|---|
| 23 | n/a |         for key in self.dict: | 
|---|
| 24 | n/a |             window = self.dict[key] | 
|---|
| 25 | n/a |             try: | 
|---|
| 26 | n/a |                 title = window.get_title() | 
|---|
| 27 | n/a |             except TclError: | 
|---|
| 28 | n/a |                 continue | 
|---|
| 29 | n/a |             list.append((title, key, window)) | 
|---|
| 30 | n/a |         list.sort() | 
|---|
| 31 | n/a |         for title, key, window in list: | 
|---|
| 32 | n/a |             menu.add_command(label=title, command=window.wakeup) | 
|---|
| 33 | n/a |  | 
|---|
| 34 | n/a |     def register_callback(self, callback): | 
|---|
| 35 | n/a |         self.callbacks.append(callback) | 
|---|
| 36 | n/a |  | 
|---|
| 37 | n/a |     def unregister_callback(self, callback): | 
|---|
| 38 | n/a |         try: | 
|---|
| 39 | n/a |             self.callbacks.remove(callback) | 
|---|
| 40 | n/a |         except ValueError: | 
|---|
| 41 | n/a |             pass | 
|---|
| 42 | n/a |  | 
|---|
| 43 | n/a |     def call_callbacks(self): | 
|---|
| 44 | n/a |         for callback in self.callbacks: | 
|---|
| 45 | n/a |             try: | 
|---|
| 46 | n/a |                 callback() | 
|---|
| 47 | n/a |             except: | 
|---|
| 48 | n/a |                 t, v, tb = sys.exc_info() | 
|---|
| 49 | n/a |                 print("warning: callback failed in WindowList", t, ":", v) | 
|---|
| 50 | n/a |  | 
|---|
| 51 | n/a | registry = WindowList() | 
|---|
| 52 | n/a |  | 
|---|
| 53 | n/a | add_windows_to_menu = registry.add_windows_to_menu | 
|---|
| 54 | n/a | register_callback = registry.register_callback | 
|---|
| 55 | n/a | unregister_callback = registry.unregister_callback | 
|---|
| 56 | n/a |  | 
|---|
| 57 | n/a |  | 
|---|
| 58 | n/a | class ListedToplevel(Toplevel): | 
|---|
| 59 | n/a |  | 
|---|
| 60 | n/a |     def __init__(self, master, **kw): | 
|---|
| 61 | n/a |         Toplevel.__init__(self, master, kw) | 
|---|
| 62 | n/a |         registry.add(self) | 
|---|
| 63 | n/a |         self.focused_widget = self | 
|---|
| 64 | n/a |  | 
|---|
| 65 | n/a |     def destroy(self): | 
|---|
| 66 | n/a |         registry.delete(self) | 
|---|
| 67 | n/a |         Toplevel.destroy(self) | 
|---|
| 68 | n/a |         # If this is Idle's last window then quit the mainloop | 
|---|
| 69 | n/a |         # (Needed for clean exit on Windows 98) | 
|---|
| 70 | n/a |         if not registry.dict: | 
|---|
| 71 | n/a |             self.quit() | 
|---|
| 72 | n/a |  | 
|---|
| 73 | n/a |     def update_windowlist_registry(self, window): | 
|---|
| 74 | n/a |         registry.call_callbacks() | 
|---|
| 75 | n/a |  | 
|---|
| 76 | n/a |     def get_title(self): | 
|---|
| 77 | n/a |         # Subclass can override | 
|---|
| 78 | n/a |         return self.wm_title() | 
|---|
| 79 | n/a |  | 
|---|
| 80 | n/a |     def wakeup(self): | 
|---|
| 81 | n/a |         try: | 
|---|
| 82 | n/a |             if self.wm_state() == "iconic": | 
|---|
| 83 | n/a |                 self.wm_withdraw() | 
|---|
| 84 | n/a |                 self.wm_deiconify() | 
|---|
| 85 | n/a |             self.tkraise() | 
|---|
| 86 | n/a |             self.focused_widget.focus_set() | 
|---|
| 87 | n/a |         except TclError: | 
|---|
| 88 | n/a |             # This can happen when the window menu was torn off. | 
|---|
| 89 | n/a |             # Simply ignore it. | 
|---|
| 90 | n/a |             pass | 
|---|