# 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