mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	
		
			
	
	
		
			93 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			93 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | from Tkinter import * | ||
|  | 
 | ||
|  | 
 | ||
|  | class WidgetRedirector: | ||
|  | 
 | ||
|  |     """Support for redirecting arbitrary widget subcommands.""" | ||
|  | 
 | ||
|  |     def __init__(self, widget): | ||
|  |         self.dict = {} | ||
|  |         self.widget = widget | ||
|  |         self.tk = tk = widget.tk | ||
|  |         w = widget._w | ||
|  |         self.orig = w + "_orig" | ||
|  |         tk.call("rename", w, self.orig) | ||
|  |         tk.createcommand(w, self.dispatch) | ||
|  | 
 | ||
|  |     def __repr__(self): | ||
|  |         return "WidgetRedirector(%s<%s>)" % (self.widget.__class__.__name__, | ||
|  |                                              self.widget._w) | ||
|  | 
 | ||
|  |     def close(self): | ||
|  |         for name in self.dict.keys(): | ||
|  |             self.unregister(name) | ||
|  |         widget = self.widget; del self.widget | ||
|  |         orig = self.orig; del self.orig | ||
|  |         tk = widget.tk | ||
|  |         w = widget._w | ||
|  |         tk.deletecommand(w) | ||
|  |         tk.call("rename", orig, w) | ||
|  | 
 | ||
|  |     def register(self, name, function): | ||
|  |         if self.dict.has_key(name): | ||
|  |             previous = dict[name] | ||
|  |         else: | ||
|  |             previous = OriginalCommand(self, name) | ||
|  |         self.dict[name] = function | ||
|  |         setattr(self.widget, name, function) | ||
|  |         return previous | ||
|  | 
 | ||
|  |     def unregister(self, name): | ||
|  |         if self.dict.has_key(name): | ||
|  |             function = self.dict[name] | ||
|  |             del self.dict[name] | ||
|  |             if hasattr(self.widget, name): | ||
|  |                 delattr(self.widget, name) | ||
|  |             return function | ||
|  |         else: | ||
|  |             return None | ||
|  | 
 | ||
|  |     def dispatch(self, cmd, *args): | ||
|  |         m = self.dict.get(cmd) | ||
|  |         try: | ||
|  |             if m: | ||
|  |                 return apply(m, args) | ||
|  |             else: | ||
|  |                 return self.tk.call((self.orig, cmd) + args) | ||
|  |         except TclError: | ||
|  |             return "" | ||
|  | 
 | ||
|  | 
 | ||
|  | class OriginalCommand: | ||
|  | 
 | ||
|  |     def __init__(self, redir, name): | ||
|  |         self.redir = redir | ||
|  |         self.name = name | ||
|  |         self.tk = redir.tk | ||
|  |         self.orig = redir.orig | ||
|  |         self.tk_call = self.tk.call | ||
|  |         self.orig_and_name = (self.orig, self.name) | ||
|  | 
 | ||
|  |     def __repr__(self): | ||
|  |         return "OriginalCommand(%s, %s)" % (`self.redir`, `self.name`) | ||
|  | 
 | ||
|  |     def __call__(self, *args): | ||
|  |         return self.tk_call(self.orig_and_name + args) | ||
|  | 
 | ||
|  | 
 | ||
|  | def main(): | ||
|  |     root = Tk() | ||
|  |     text = Text() | ||
|  |     text.pack() | ||
|  |     text.focus_set() | ||
|  |     redir = WidgetRedirector(text) | ||
|  |     global orig_insert | ||
|  |     def my_insert(*args): | ||
|  |         print "insert", args | ||
|  |         apply(orig_insert, args) | ||
|  |     orig_insert = redir.register("insert", my_insert) | ||
|  |     root.mainloop() | ||
|  | 
 | ||
|  | if __name__ == "__main__": | ||
|  |     main() |