| 
									
										
										
										
											2019-01-06 15:55:52 -05:00
										 |  |  | from tkinter import Toplevel, TclError | 
					
						
							|  |  |  | import sys | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-31 00:50:55 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | class WindowList: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self): | 
					
						
							|  |  |  |         self.dict = {} | 
					
						
							|  |  |  |         self.callbacks = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def add(self, window): | 
					
						
							|  |  |  |         window.after_idle(self.call_callbacks) | 
					
						
							|  |  |  |         self.dict[str(window)] = window | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def delete(self, window): | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             del self.dict[str(window)] | 
					
						
							|  |  |  |         except KeyError: | 
					
						
							|  |  |  |             # Sometimes, destroy() is called twice | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |         self.call_callbacks() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def add_windows_to_menu(self,  menu): | 
					
						
							|  |  |  |         list = [] | 
					
						
							| 
									
										
										
										
											2007-08-23 05:25:55 +00:00
										 |  |  |         for key in self.dict: | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |             window = self.dict[key] | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 title = window.get_title() | 
					
						
							|  |  |  |             except TclError: | 
					
						
							|  |  |  |                 continue | 
					
						
							| 
									
										
										
										
											2008-11-28 23:28:42 +00:00
										 |  |  |             list.append((title, key, window)) | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         list.sort() | 
					
						
							| 
									
										
										
										
											2008-11-28 23:28:42 +00:00
										 |  |  |         for title, key, window in list: | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |             menu.add_command(label=title, command=window.wakeup) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def register_callback(self, callback): | 
					
						
							|  |  |  |         self.callbacks.append(callback) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def unregister_callback(self, callback): | 
					
						
							|  |  |  |         try: | 
					
						
							| 
									
										
										
										
											2001-07-12 05:35:17 +00:00
										 |  |  |             self.callbacks.remove(callback) | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         except ValueError: | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def call_callbacks(self): | 
					
						
							|  |  |  |         for callback in self.callbacks: | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 callback() | 
					
						
							|  |  |  |             except: | 
					
						
							| 
									
										
										
										
											2006-04-17 23:13:00 +00:00
										 |  |  |                 t, v, tb = sys.exc_info() | 
					
						
							| 
									
										
										
										
											2007-02-09 05:37:30 +00:00
										 |  |  |                 print("warning: callback failed in WindowList", t, ":", v) | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-31 00:50:55 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | registry = WindowList() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | add_windows_to_menu = registry.add_windows_to_menu | 
					
						
							|  |  |  | register_callback = registry.register_callback | 
					
						
							|  |  |  | unregister_callback = registry.unregister_callback | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ListedToplevel(Toplevel): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, master, **kw): | 
					
						
							|  |  |  |         Toplevel.__init__(self, master, kw) | 
					
						
							|  |  |  |         registry.add(self) | 
					
						
							| 
									
										
										
										
											2004-08-22 05:14:32 +00:00
										 |  |  |         self.focused_widget = self | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def destroy(self): | 
					
						
							|  |  |  |         registry.delete(self) | 
					
						
							|  |  |  |         Toplevel.destroy(self) | 
					
						
							| 
									
										
										
										
											2002-10-04 21:54:41 +00:00
										 |  |  |         # If this is Idle's last window then quit the mainloop | 
					
						
							|  |  |  |         # (Needed for clean exit on Windows 98) | 
					
						
							|  |  |  |         if not registry.dict: | 
					
						
							|  |  |  |             self.quit() | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-06 21:58:38 +00:00
										 |  |  |     def update_windowlist_registry(self, window): | 
					
						
							|  |  |  |         registry.call_callbacks() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |     def get_title(self): | 
					
						
							|  |  |  |         # Subclass can override | 
					
						
							|  |  |  |         return self.wm_title() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def wakeup(self): | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             if self.wm_state() == "iconic": | 
					
						
							| 
									
										
										
										
											2004-08-22 05:14:32 +00:00
										 |  |  |                 self.wm_withdraw() | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |                 self.wm_deiconify() | 
					
						
							| 
									
										
										
										
											2004-08-22 05:14:32 +00:00
										 |  |  |             self.tkraise() | 
					
						
							|  |  |  |             self.focused_widget.focus_set() | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         except TclError: | 
					
						
							| 
									
										
										
										
											2018-06-20 21:25:59 -04:00
										 |  |  |             # This can happen when the Window menu was torn off. | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |             # Simply ignore it. | 
					
						
							|  |  |  |             pass | 
					
						
							| 
									
										
										
										
											2018-06-19 19:12:52 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     from unittest import main | 
					
						
							| 
									
										
										
										
											2018-06-20 21:25:59 -04:00
										 |  |  |     main('idlelib.idle_test.test_window', verbosity=2) |