1from gi.repository import Gtk, GObject 2 3 4class Accordion(Gtk.TreeView): 5 def __init__(self, model): 6 GObject.GObject.__init__(self, model) 7 8 self.set_headers_visible(False) 9 self.set_property("show-expanders", False) 10 self.set_property("level-indentation", 10) 11 12 renderer = Gtk.CellRendererText() 13 column = Gtk.TreeViewColumn('Column', renderer) 14 15 def top_level(column, cell, store, iter): 16 cell.set_property("text", store[iter][0]) 17 if store.iter_depth(iter) == 0: 18 cell.set_property('foreground', "black") 19 cell.set_property('background', "gray") 20 else: 21 cell.set_property('foreground', "black") 22 cell.set_property('background', "white") 23 24 column.set_cell_data_func(renderer, top_level) 25 26 self.append_column(column) 27 28 selection = self.get_selection() 29 selection.set_mode(Gtk.SelectionMode.SINGLE) 30 selection.connect('changed', self.on_selection_changed) 31 self.current = None 32 33 def on_selection_changed(self, selection, data=None): 34 model, iter = selection.get_selected() 35 36 if model.iter_depth(iter) == 0 and iter != self.current: 37 self.collapse_all() 38 self.expand_row(model.get_path(iter), True) 39 self.current = iter 40 41 selected_item = model.get_value(iter, 0) 42 print(selected_item) 43 44 45if __name__ == "__main__": 46 window = Gtk.Window(Gtk.WindowType.TOPLEVEL) 47 window.set_title("Accordion example") 48 window.set_size_request(200, 200) 49 window.connect("delete_event", Gtk.main_quit) 50 51 treestore = Gtk.TreeStore(str) 52 for parent in range(4): 53 piter = treestore.append(None, ['parent %i' % parent]) 54 for child in range(3): 55 treestore.append(piter, 56 ['child %i of parent %i' % (child, parent)]) 57 accordion = Accordion(treestore) 58 window.add(accordion) 59 window.show_all() 60 Gtk.main() 61