|
1 # XXX TO DO: |
|
2 # - popup menu |
|
3 # - support partial or total redisplay |
|
4 # - more doc strings |
|
5 # - tooltips |
|
6 |
|
7 # object browser |
|
8 |
|
9 # XXX TO DO: |
|
10 # - for classes/modules, add "open source" to object browser |
|
11 |
|
12 from TreeWidget import TreeItem, TreeNode, ScrolledCanvas |
|
13 |
|
14 from repr import Repr |
|
15 |
|
16 myrepr = Repr() |
|
17 myrepr.maxstring = 100 |
|
18 myrepr.maxother = 100 |
|
19 |
|
20 class ObjectTreeItem(TreeItem): |
|
21 def __init__(self, labeltext, object, setfunction=None): |
|
22 self.labeltext = labeltext |
|
23 self.object = object |
|
24 self.setfunction = setfunction |
|
25 def GetLabelText(self): |
|
26 return self.labeltext |
|
27 def GetText(self): |
|
28 return myrepr.repr(self.object) |
|
29 def GetIconName(self): |
|
30 if not self.IsExpandable(): |
|
31 return "python" |
|
32 def IsEditable(self): |
|
33 return self.setfunction is not None |
|
34 def SetText(self, text): |
|
35 try: |
|
36 value = eval(text) |
|
37 self.setfunction(value) |
|
38 except: |
|
39 pass |
|
40 else: |
|
41 self.object = value |
|
42 def IsExpandable(self): |
|
43 return not not dir(self.object) |
|
44 def GetSubList(self): |
|
45 keys = dir(self.object) |
|
46 sublist = [] |
|
47 for key in keys: |
|
48 try: |
|
49 value = getattr(self.object, key) |
|
50 except AttributeError: |
|
51 continue |
|
52 item = make_objecttreeitem( |
|
53 str(key) + " =", |
|
54 value, |
|
55 lambda value, key=key, object=self.object: |
|
56 setattr(object, key, value)) |
|
57 sublist.append(item) |
|
58 return sublist |
|
59 |
|
60 class InstanceTreeItem(ObjectTreeItem): |
|
61 def IsExpandable(self): |
|
62 return True |
|
63 def GetSubList(self): |
|
64 sublist = ObjectTreeItem.GetSubList(self) |
|
65 sublist.insert(0, |
|
66 make_objecttreeitem("__class__ =", self.object.__class__)) |
|
67 return sublist |
|
68 |
|
69 class ClassTreeItem(ObjectTreeItem): |
|
70 def IsExpandable(self): |
|
71 return True |
|
72 def GetSubList(self): |
|
73 sublist = ObjectTreeItem.GetSubList(self) |
|
74 if len(self.object.__bases__) == 1: |
|
75 item = make_objecttreeitem("__bases__[0] =", |
|
76 self.object.__bases__[0]) |
|
77 else: |
|
78 item = make_objecttreeitem("__bases__ =", self.object.__bases__) |
|
79 sublist.insert(0, item) |
|
80 return sublist |
|
81 |
|
82 class AtomicObjectTreeItem(ObjectTreeItem): |
|
83 def IsExpandable(self): |
|
84 return 0 |
|
85 |
|
86 class SequenceTreeItem(ObjectTreeItem): |
|
87 def IsExpandable(self): |
|
88 return len(self.object) > 0 |
|
89 def keys(self): |
|
90 return range(len(self.object)) |
|
91 def GetSubList(self): |
|
92 sublist = [] |
|
93 for key in self.keys(): |
|
94 try: |
|
95 value = self.object[key] |
|
96 except KeyError: |
|
97 continue |
|
98 def setfunction(value, key=key, object=self.object): |
|
99 object[key] = value |
|
100 item = make_objecttreeitem("%r:" % (key,), value, setfunction) |
|
101 sublist.append(item) |
|
102 return sublist |
|
103 |
|
104 class DictTreeItem(SequenceTreeItem): |
|
105 def keys(self): |
|
106 keys = self.object.keys() |
|
107 try: |
|
108 keys.sort() |
|
109 except: |
|
110 pass |
|
111 return keys |
|
112 |
|
113 from types import * |
|
114 |
|
115 dispatch = { |
|
116 IntType: AtomicObjectTreeItem, |
|
117 LongType: AtomicObjectTreeItem, |
|
118 FloatType: AtomicObjectTreeItem, |
|
119 StringType: AtomicObjectTreeItem, |
|
120 TupleType: SequenceTreeItem, |
|
121 ListType: SequenceTreeItem, |
|
122 DictType: DictTreeItem, |
|
123 InstanceType: InstanceTreeItem, |
|
124 ClassType: ClassTreeItem, |
|
125 } |
|
126 |
|
127 def make_objecttreeitem(labeltext, object, setfunction=None): |
|
128 t = type(object) |
|
129 if dispatch.has_key(t): |
|
130 c = dispatch[t] |
|
131 else: |
|
132 c = ObjectTreeItem |
|
133 return c(labeltext, object, setfunction) |
|
134 |
|
135 # Test script |
|
136 |
|
137 def _test(): |
|
138 import sys |
|
139 from Tkinter import Tk |
|
140 root = Tk() |
|
141 root.configure(bd=0, bg="yellow") |
|
142 root.focus_set() |
|
143 sc = ScrolledCanvas(root, bg="white", highlightthickness=0, takefocus=1) |
|
144 sc.frame.pack(expand=1, fill="both") |
|
145 item = make_objecttreeitem("sys", sys) |
|
146 node = TreeNode(sc.canvas, None, item) |
|
147 node.update() |
|
148 root.mainloop() |
|
149 |
|
150 if __name__ == '__main__': |
|
151 _test() |