Guido van Rossum | 3b4ca0d | 1998-10-10 18:48:31 +0000 | [diff] [blame] | 1 | from Tkinter import * |
| 2 | |
| 3 | |
| 4 | class WidgetRedirector: |
| 5 | |
| 6 | """Support for redirecting arbitrary widget subcommands.""" |
| 7 | |
| 8 | def __init__(self, widget): |
| 9 | self.dict = {} |
| 10 | self.widget = widget |
| 11 | self.tk = tk = widget.tk |
| 12 | w = widget._w |
| 13 | self.orig = w + "_orig" |
| 14 | tk.call("rename", w, self.orig) |
| 15 | tk.createcommand(w, self.dispatch) |
| 16 | |
| 17 | def __repr__(self): |
| 18 | return "WidgetRedirector(%s<%s>)" % (self.widget.__class__.__name__, |
| 19 | self.widget._w) |
| 20 | |
| 21 | def __del__(self): |
| 22 | self.close() |
| 23 | |
| 24 | def close(self): |
| 25 | self.dict = {} |
| 26 | widget = self.widget; del self.widget |
| 27 | orig = self.orig; del self.orig |
| 28 | tk = widget.tk |
| 29 | w = widget._w |
| 30 | tk.deletecommand(w) |
| 31 | tk.call("rename", w, orig) |
| 32 | |
| 33 | def register(self, name, function): |
| 34 | if self.dict.has_key(name): |
| 35 | previous = function |
| 36 | else: |
| 37 | previous = OriginalCommand(self, name) |
| 38 | self.dict[name] = function |
| 39 | setattr(self.widget, name, function) |
| 40 | return previous |
| 41 | |
| 42 | def dispatch(self, cmd, *args): |
| 43 | m = self.dict.get(cmd) |
| 44 | try: |
| 45 | if m: |
| 46 | return apply(m, args) |
| 47 | else: |
| 48 | return self.tk.call((self.orig, cmd) + args) |
| 49 | except TclError: |
| 50 | return "" |
| 51 | |
| 52 | |
| 53 | class OriginalCommand: |
| 54 | |
| 55 | def __init__(self, redir, name): |
| 56 | self.redir = redir |
| 57 | self.name = name |
| 58 | self.tk = redir.tk |
| 59 | self.orig = redir.orig |
| 60 | self.tk_call = self.tk.call |
| 61 | self.orig_and_name = (self.orig, self.name) |
| 62 | |
| 63 | def __repr__(self): |
| 64 | return "OriginalCommand(%s, %s)" % (`self.redir`, `self.name`) |
| 65 | |
| 66 | def __call__(self, *args): |
| 67 | return self.tk_call(self.orig_and_name + args) |
| 68 | |
| 69 | |
| 70 | def main(): |
| 71 | root = Tk() |
| 72 | text = Text() |
| 73 | text.pack() |
| 74 | text.focus_set() |
| 75 | redir = WidgetRedirector(text) |
| 76 | global orig_insert |
| 77 | def my_insert(*args): |
| 78 | print "insert", args |
| 79 | apply(orig_insert, args) |
| 80 | orig_insert = redir.register("insert", my_insert) |
| 81 | root.mainloop() |
| 82 | |
| 83 | if __name__ == "__main__": |
| 84 | main() |