TreeView s TreeStore (Python) Marta Maria Casetti mmcasetti@gmail.com 2012 TreeView zobrazující TreeStore (více komplexní příklad s CellRendererToggle) Více komplexní TreeView s TreeStore

Tento widget TreeView zobrazuje TreeStore se dvěma sloupci, z nichž jeden je vykreslován jako přepínač.

Kód použitý k vygenerování tohoto příkladu 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) # Data jsou uložena v modelu # Vytvoří stromové zobrazení se dvěma sloupci self.store = Gtk.TreeStore(str, bool) # Naplní model for i in range(len(books)): # Iterátor piter je vrácen, kdy se připojuje autor v prvním sloupci # a hodnota False ve druhém sloupci piter = self.store.append(None, [books[i][0], False]) # Připojí knihy a přidruženou pravdivostní hodnotu jako potomky # autora j = 1 while j < len(books[i]): self.store.append(piter, books[i][j]) j += 1 # TreeView zobrazuje model # Vytvoří stromové zobrazení na modelu self.store view = Gtk.TreeView() view.set_model(self.store) # Vykreslovač pro první sloupec - text renderer_books = Gtk.CellRendererText() # Vytvoří první sloupec column_books = Gtk.TreeViewColumn("Books", renderer_books, text=0) # A připojí jej do stromového zobrazení view.append_column(column_books) # Vykreslovat pro druhý sloupec - pravdivostní hodnota jako přepínač renderer_in_out = Gtk.CellRendererToggle() # Vytvoří druhý sloupec column_in_out = Gtk.TreeViewColumn("Out?", renderer_in_out, active=1) # A připojí jej do stromového zobrazení view.append_column(column_in_out) # Napojí signál "toggled" na funkci zpětného volání renderer_in_out.connect("toggled", self.on_toggled) # Přidá stromové zobrazení do okna self.add(view) # Funkce zpětného volání pro signál vyslaný od CellRendererToggle def on_toggled(self, widget, path): # Pravdivostní hodnota vybraného řádku current_value = self.store[path][1] # Změní pravdivostní hodnotu vybraného řádku v modelu self.store[path][1] = not current_value # Nová aktuální hodnota! current_value = not current_value # Jestliže je délka cesty 1 (tj. je vybrán autor) if len(path) == 1: # Získá iterátor patřící cestě piter = self.store.get_iter(path) # Získá iterátor patřící jejímu prvnímu potomkovi citer = self.store.iter_children(piter) # Dokud existují potomoci, mění stav jejich pravdivostních hodnot # na hodnotu u autora while citer is not None: self.store[citer][1] = current_value citer = self.store.iter_next(citer) # Jestliže délka cesty naní 1 (tj. je vybrána kniha) elif len(path) != 1: # Získá prvního potomka od rodiče knihy (první kniha autora) citer = self.store.get_iter(path) piter = self.store.iter_parent(citer) citer = self.store.iter_children(piter) # Zkontroluje, jestli jsou vybráni všichni potomci all_selected = True while citer is not None: if self.store[citer][1] == False: all_selected = False break citer = self.store.iter_next(citer) # Pokud ano, je vybrán i autor, jinak ne 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)
Užitečné metody pro widget TreeView

Widget TreeView je navrže okolo návrhu Model/Zobrazení/Ovládání: Model uchovává data, Zobrazení získává upozornění a zobrazuje obsah modelu a konečně Ovládání změní stav modelu a upozorňuje zobrazení na tyto změny. Podrobnější informace a seznam užitečných metod pro stromové zobrazení najdete v .

Na řádku 48 je signál "toggled" napojen na funkci zpětného volání on_toggled() pomocí widget.connect(signál, funkce zpětného volání). Podrobnější vysvětlení viz .

Odkazy k API

V této ukázce se používá následující:

GtkTreeView

GtkTreeModel

GtkTreeStore

GtkCellRendererText

GtkCellRendererToggle

GtkTreeViewColumn