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