TreeView with TreeStore (Python) Marta Maria Casetti mmcasetti@gmail.com 2012 Une TreeView affichant un TreeStore (exemple plus complexe avec CellRendererToggle) Luc Rebert, traduc@rebert.name 2011 Alain Lojewski, allomervan@gmail.com 2011-2012 Luc Pionchon pionchon.luc@gmail.com 2011 Bruno Brouard annoa.b@gmail.com 2011-12 Luis Menina liberforce@freeside.fr 2014 More Complex TreeView with TreeStore

Ce TreeView affiche un TreeStore de deux colonnes, dont l'une est affichée sous la forme d'un inverseur.

Code utilisé pour générer cet exemple from gi.repository import Gtk from gi.repository import Pango import sys books = [["Tolstoy, Leo", ["War and Peace", True], ["Anna Karenina", False]], ["Shakespeare, William", ["Hamlet", False], ["Macbeth", True], ["Othello", False]], ["Tolkien, J.R.R.", ["The Lord of the Rings", False]]] class MyWindow(Gtk.ApplicationWindow): def __init__(self, app): Gtk.Window.__init__(self, title="Library", application=app) self.set_default_size(250, 100) self.set_border_width(10) # the data are stored in the model # create a treestore with two columns self.store = Gtk.TreeStore(str, bool) # fill in the model for i in range(len(books)): # the iter piter is returned when appending the author in the first column # and False in the second piter = self.store.append(None, [books[i][0], False]) # append the books and the associated boolean value as children of # the author j = 1 while j < len(books[i]): self.store.append(piter, books[i][j]) j += 1 # the treeview shows the model # create a treeview on the model self.store view = Gtk.TreeView() view.set_model(self.store) # the cellrenderer for the first column - text renderer_books = Gtk.CellRendererText() # the first column is created column_books = Gtk.TreeViewColumn("Books", renderer_books, text=0) # and it is appended to the treeview view.append_column(column_books) # the cellrenderer for the second column - boolean rendered as a toggle renderer_in_out = Gtk.CellRendererToggle() # the second column is created column_in_out = Gtk.TreeViewColumn("Out?", renderer_in_out, active=1) # and it is appended to the treeview view.append_column(column_in_out) # connect the cellrenderertoggle with a callback function renderer_in_out.connect("toggled", self.on_toggled) # add the treeview to the window self.add(view) # callback function for the signal emitted by the cellrenderertoggle def on_toggled(self, widget, path): # the boolean value of the selected row current_value = self.store[path][1] # change the boolean value of the selected row in the model self.store[path][1] = not current_value # new current value! current_value = not current_value # if length of the path is 1 (that is, if we are selecting an author) if len(path) == 1: # get the iter associated with the path piter = self.store.get_iter(path) # get the iter associated with its first child citer = self.store.iter_children(piter) # while there are children, change the state of their boolean value # to the value of the author while citer is not None: self.store[citer][1] = current_value citer = self.store.iter_next(citer) # if the length of the path is not 1 (that is, if we are selecting a # book) elif len(path) != 1: # get the first child of the parent of the book (the first book of # the author) citer = self.store.get_iter(path) piter = self.store.iter_parent(citer) citer = self.store.iter_children(piter) # check if all the children are selected all_selected = True while citer is not None: if self.store[citer][1] == False: all_selected = False break citer = self.store.iter_next(citer) # if they do, the author as well is selected; otherwise it is not self.store[piter][1] = all_selected class MyApplication(Gtk.Application): def __init__(self): Gtk.Application.__init__(self) def do_activate(self): win = MyWindow(self) win.show_all() def do_startup(self): Gtk.Application.do_startup(self) app = MyApplication() exit_status = app.run(sys.argv) sys.exit(exit_status)
Méthodes utiles pour un élément graphique TreeView

The TreeView widget is designed around a Model/View/Controller design: the Model stores the data; the View gets change notifications and displays the content of the model; the Controller, finally, changes the state of the model and notifies the view of these changes. For more information and for a list of useful methods for TreeModel see .

In line 48 the "toggled" signal is connected to the callback function on_toggled() using widget.connect(signal, callback function). See for a more detailed explanation.

Références API

Dans cet exemple, les éléments suivants sont utilisés :

GtkTreeView

GtkTreeModel

GtkTreeStore

GtkCellRendererText

GtkCellRendererToggle

GtkTreeViewColumn