Začněte opět se vzorem GTK aplikace. V Glade si vyrobte okno s jedním tlačítkem a jedním prvkem gtk.TreeView.
Tento kód používá část metod objektu gtk.TreeStore. Vložte do funkce __init__() v programu následující trochu složitý kód a projdeme si, co se děje.
## Přidáme TreeStore -- neviditelný widget k uskladnění dat
self.treestore1 = gtk.TreeStore(gtk.gdk.Pixbuf, str)
self.w("treeview1").set_model(self.treestore1)
## Do TreeView přidáme první sloupec
self.tvColumn1= gtk.TreeViewColumn()
self.w("treeview1").append_column(self.tvColumn1)
## Do prvního sloupce přidáme místo pro obrázek
render_pixbuf = gtk.CellRendererPixbuf()
self.tvColumn1.pack_start(render_pixbuf, expand=False)
self.tvColumn1.add_attribute(render_pixbuf, 'pixbuf', 0)
## Do prvního sloupce přidáme místo pro text hned za obrázek
render_text = gtk.CellRendererText()
self.tvColumn1.pack_start(render_text, expand=True)
self.tvColumn1.add_attribute(render_text, 'text', 1)
## Vyrobime prvni radek v seznamu
obrazek = self.w("treeview1").render_icon(stock_id=getattr(gtk, "STOCK_COLOR_PICKER"),\
size=gtk.ICON_SIZE_MENU, detail=None)
text = "Radek v tabulce"
ThisTreestoreRow = self.treestore1.append(parent=None, row=(obrazek, text))
Přidejte pod předchozí kód do funkce __init__ následující řádky:
## Vyrobime druhy radek v seznamu
obrazek = self.w("treeview1").render_icon(stock_id=getattr(gtk, "STOCK_COLOR_PICKER"),\
size=gtk.ICON_SIZE_MENU, detail=None)
text = "Radek v tabulce"
self.treestore1.append(parent=None, row=(obrazek, text))
Alternativa: Jako parametr parent můžete použít už existující řádek:
## Vyrobime druhy radek v seznamu
obrazek = self.w("treeview1").render_icon(stock_id=getattr(gtk, "STOCK_COLOR_PICKER"),\
size=gtk.ICON_SIZE_MENU, detail=None)
text = "Radek v tabulce"
self.treestore1.append(parent=ThisTreestoreRow, row=(obrazek, text))
V čem se chování kódu liší?
Pozn. galerii nachystaných obrázků v GTK najdete např. zde.
## Ruční přidání obsluhy události
self.w("treeview1").get_selection().set_mode("GTK_SELECTION_MULTIPLE")
self.w("treeview1").get_selection().connect('changed', self.treeview1_on_selection_changed)
Přidejte dále tuto obsluhu událostí:
def treeview1_on_selection_changed(self, selection):
treeiter = self.treestore1.get_iter_first()
print
while treeiter != None:
if self.w("treeview1").get_selection().iter_is_selected(treeiter):
print "Row", self.treestore1.get_string_from_iter(treeiter), "is selected"
else:
print "Row", self.treestore1.get_string_from_iter(treeiter), "is NOT selected"
treeiter=self.treestore1.iter_next(treeiter)