# Jednoduchý Treeview s ListStore (Python)

Marta Maria Casetti
mmcasetti@gmail.com 2012
TreeView zobrazující ListStore (více komplexní příklad)

# Více komplexní Treeview s ListStore

Tento TreeView zobrazuje jednoduchý ListStore s napojeným signálem `"changed"` (změna výběru).

# Kód použitý k vygenerování tohoto příkladu

from gi.repository import Gtk from gi.repository import Pango import sys

list_of_dvd = [["The Usual Suspects"], ["Gilda"], ["The Godfather"], ["Pulp Fiction"], ["Once Upon a Time in the West"], ["Rear Window"]]

class MyWindow(Gtk.ApplicationWindow):

def __init__(self, app): Gtk.Window.__init__(self, title="My DVDs", application=app) self.set_default_size(250, 100) self.set_border_width(10)

# Datové úložiště v modelu # Vytvoří ListStore s jedním sloupcem self.listmodel = Gtk.ListStore(str) for i in range(len(list_of_dvd)): self.listmodel.append(list_of_dvd[i])

# TreeView pro zobrazení dat uložených v modelu view = Gtk.TreeView(model=self.listmodel)

# Vykreslovač buňky pro první sloupec cell = Gtk.CellRendererText() # Vytvoří první sloupec col = Gtk.TreeViewColumn("Title", cell, text=0) # a připojí jej do stromového zobrazení view.append_column(col)

# Když je ve stromovém zobrazení vybrán řádek, vyšle signál self.selection = view.get_selection() self.selection.connect("changed", self.on_changed)

# Popisek, který použijeme k zobrazení výběru self.label = Gtk.Label() self.label.set_text("")

# Tlačítko pro přidání nového názvu, napojené na funkci zpětného volání self.button_add = Gtk.Button(label="Add") self.button_add.connect("clicked", self.add_cb)

# Vstupní pole pro zadávání názvů self.entry = Gtk.Entry()

# Tlačítko pro odstranění názvů, napojené na funkci zpětného volání self.button_remove = Gtk.Button(label="Remove") self.button_remove.connect("clicked", self.remove_cb)

# Tlačítko pro odstranění všech názvů, napojené na funkci zpětného volání self.button_remove_all = Gtk.Button(label="Remove All") self.button_remove_all.connect("clicked", self.remove_all_cb)

# Mřížka pro připojení widgetů grid = Gtk.Grid() grid.attach(view, 0, 0, 4, 1) grid.attach(self.label, 0, 1, 4, 1) grid.attach(self.button_add, 0, 2, 1, 1) grid.attach_next_to( self.entry, self.button_add, Gtk.PositionType.RIGHT, 1, 1) grid.attach_next_to( self.button_remove, self.entry, Gtk.PositionType.RIGHT, 1, 1) grid.attach_next_to( self.button_remove_all, self.button_remove, Gtk.PositionType.RIGHT, 1, 1)

# Přidá mřížku do okna self.add(grid)

def on_changed(self, selection): # Získá model a iterátor, který ukazuje na data v modelu (model, iter) = selection.get_selected() # Nastaví popisek na novou hodnotu podle výběru, pokud něco # vybráno je if iter is not None: self.label.set_text("\n %s" % (model[iter][0])) else: self.label.set_text("") return True

# Funkce zpětného volání pro tlačítko "Add" def add_cb(self, button): # Připojí do modelu názevu, který je ve vstupním poli title = self.entry.get_text() self.listmodel.append([title]) # A vypíše zprávu do terminálu print("%s has been added" % (title))

def remove_cb(self, button): # Jestliže je v modelu ještě nějaký záznam if len(self.listmodel) != 0: # Získá výběr (model, iter) = self.selection.get_selected() # Jestliže je něco vybráno, vypíše zprávu do terminálu # a odstraní to z modelu if iter is not None: print("%s has been removed" % (model[iter][0])) self.listmodel.remove(iter) # Jinak vyzve uživatele, aby vybral, co chce odstranit else: print("Select a title to remove") # Jinka, když v modelu není žádný záznam, vypíše "Empty list" # do terminálu else: print("Empty list")

def remove_all_cb(self, button): # Jestliže je v modelu ještě nějaký záznam if len(self.listmodel) != 0: # Odstraní všechny záznamy v modelu for i in range(len(self.listmodel)): iter = self.listmodel.get_iter(0) self.listmodel.remove(iter) # Vypíše do terminálu zprávu, že model je teď prázdný print("Empty list")

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 36 je signál `"changed"` napojen na funkci zpětného volání `on_changed()` 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

GtkListStore

GtkCellRendererText

GtkTreeViewColumn

pygobject – vazba jazyka Python pro GObject Introspection