blob: 45f86f7e387b5694b28b1f5d010a3c2b724f1a36 [file] [log] [blame]
Guido van Rossum3b4ca0d1998-10-10 18:48:31 +00001from Tkinter import *
2
3
4class 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
53class 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
70def 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
83if __name__ == "__main__":
84 main()