Приветствую.
При реализации «ленивого» дерева обнаружил, что виджет gtk.TreeView неверно реагирует на возвращаемые значения обработчиков сигналов «test-expand-row» и «test-collapse-row». В документации говорится, что узлы дерева раскрываются и закрываются если обработчики этих сигналов возвращают True. На деле все происходит с точностью до наоборот — возвратишь True получишь фигу, возвратишь False получишь желаемый результат.
Вот тестовый код:
import gtk
class MyTreeView(gtk.TreeView):
__gsignals__ = {
"test-expand-row": "override",
"test-collapse-row": "override"
}
def __init__(self):
model = gtk.TreeStore(str)
super(MyTreeView, self).__init__(model)
# Fill model
for i in range(5):
parent = model.append(None, ("Parent %d" % i,))
for j in range(4):
model.append(parent, ("Child %d" % j,))
# Create column and cellrenderers
column = gtk.TreeViewColumn()
self.append_column(column)
renderer = gtk.CellRendererText()
column.pack_start(renderer, True)
column.set_attributes(renderer, text=0)
self.set_headers_visible(False)
def do_test_expand_row(self, iter, path):
return False
def do_test_collapse_row(self, iter, path):
return True
def main():
window = gtk.Window()
window.set_title("TreeView Signals Test")
window.set_default_size(600, 400)
window.connect("destroy", gtk.main_quit)
sw = gtk.ScrolledWindow()
tree = MyTreeView()
sw.add(tree)
window.add(sw)
window.show_all()
gtk.main()
if __name__ == '__main__':
main()
У меня узлы дерева распахиваются, но закрыться не в состоянии, хотя должно быть наоборот! Версия pygtk 2.24.0.
Если не мудрить с __gsignals__ и воспользоваться connect() результат аналогичен:
import gtk
class MyTreeView(gtk.TreeView):
def __init__(self):
model = gtk.TreeStore(str)
super(MyTreeView, self).__init__(model)
# Fill model
for i in range(5):
parent = model.append(None, ("Parent %d" % i,))
for j in range(4):
model.append(parent, ("Child %d" % j,))
# Create column and cellrenderers
column = gtk.TreeViewColumn()
self.append_column(column)
renderer = gtk.CellRendererText()
column.pack_start(renderer, True)
column.set_attributes(renderer, text=0)
self.set_headers_visible(False)
self.connect("test-expand-row", self.__test_expand_row)
self.connect("test-collapse-row", self.__test_collapse_row)
def __test_expand_row(self, widget, iter, path):
return False
def __test_collapse_row(self, widget, iter, path):
return True
def main():
window = gtk.Window()
window.set_title("TreeView Signals Test")
window.set_default_size(600, 400)
window.connect("destroy", gtk.main_quit)
sw = gtk.ScrolledWindow()
tree = MyTreeView()
sw.add(tree)
window.add(sw)
window.show_all()
gtk.main()
if __name__ == '__main__':
main()