1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
#!/usr/bin/env python
# This is an example of using dynamic trees (trees where nodes are only
# calculated as they are needed) with pygtk. This particular example
# allows for the browsing of the variables in a module, allowing the
# descent into classes and modules and other objects with a __dict__
# attribute.
# If this file is run straight, it will let you browse the gtk module.
import pygtk
pygtk.require('2.0')
import gtk
class BrowseVariables(gtk.VBox):
def __init__(self, name, obj):
gtk.VBox.__init__(self)
self.set_spacing(2)
#
self.sw = gtk.ScrolledWindow()
self.sw.set_size_request(300, 200)
self.sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
self.pack_start(self.sw)
self.sw.show()
#
self.disp = gtk.Entry()
self.disp.set_editable(False)
self.pack_start(self.disp, expand=False)
self.disp.show()
#
self.treestore = gtk.TreeStore(str, object)
self.tree = gtk.TreeView(self.treestore)
treeviewcolumn = gtk.TreeViewColumn('Variable',
gtk.CellRendererText(),
text=0)
self.tree.append_column(treeviewcolumn)
self.sw.add(self.tree)
self.tree.show()
#
riter = self.treestore.append(None, [name, obj])
self.treestore.append(riter, ['', None])
self.tree.connect('test-expand-row', self.expand_row_cb)
self.tree.connect('test-collapse-row', self.collapse_row_cb)
self.treeselection = self.tree.get_selection()
self.treeselection.connect('changed', self.change_selection_cb)
return
def change_selection_cb(self, treeselection):
model, iter = treeselection.get_selected()
if not iter or not self.disp:
return
key = model[iter][0]
if key == '__builtins__':
value = key
else:
value = model[iter][1]
self.disp.set_text(str(value))
return
def expand_row_cb(self, treeview, riter, path):
model = treeview.get_model()
dict = vars(model[riter][1])
if not dict:
return True
citer = model.iter_children(riter)
model.remove(citer)
keylist = dict.keys()
keylist.sort()
for key in keylist:
obj = dict[key]
i = model.append(riter, [key, obj])
try:
d = vars(obj)
if d:
model.append(i, ['', d])
except TypeError:
pass
return False
def collapse_row_cb(self, treeview, riter, path):
model = treeview.get_model()
citer = model.iter_children(riter)
if citer:
while model.remove(citer):
pass
model.append(riter, ['', None])
return True
class BrowseWindow(gtk.Window):
def __init__(self, name, dict):
gtk.Window.__init__(self)
self.set_title("Browse Window")
box = gtk.VBox()
self.add(box)
box.show()
browse = BrowseVariables(name, dict)
browse.set_border_width(10)
box.pack_start(browse)
browse.show()
separator = gtk.HSeparator()
box.pack_start(separator, expand=False)
separator.show()
box2 = gtk.VBox(spacing=10)
box2.set_border_width(10)
box.pack_start(box2, expand=False)
box2.show()
button = gtk.Button(stock=gtk.STOCK_CLOSE)
box2.pack_start(button)
button.set_flags(gtk.CAN_DEFAULT)
button.grab_default()
button.show()
self.close_button = button
return
if __name__ == '__main__':
win = BrowseWindow('gtk', gtk)
win.set_title("Browse gtk")
win.connect("destroy", lambda w: gtk.main_quit())
win.connect("delete_event", lambda w,e: gtk.main_quit())
win.close_button.connect("clicked", lambda w: gtk.main_quit())
win.show()
gtk.main()
|