Předběžný přehled témat ročníkovek zde
Příště (asi) další drobný test.
Dokončíme zvýrazňování pythonovského kódu z minulé lekce; kdo to má hotové, může vylepšit kód tak, aby nezvýrazňoval nalezená slova v řetězcích (tip: http://stackoverflow.com/questions/6462578/alternative-to-regex-match-all-instances-not-inside-quotes).
V Gtk je několik widgetů pro zadávání číselné hodnoty: gtkSpinButton, gtkHScrollBar, gtkHScale a jejich svisle otočené verze.
O hlídání toho, jakou mají hodnotu, se však vždy stará další widget, a to gtkAdjustment: Spusťte Glade a přidejte na něj neviditelný widget "adjustment1" typu gtkAdjustment.
Vytvořte v glade okno, kde bude (třeba v nějakém gtkHBoxu) pod sebou gtkSpinButton, gtkHScrollBar a gtkHScale.
U všech 3 widgetů nastavte vlastnost "Zarovnání" tak, aby směřovala na náš widget adjustment1.
V Glade přidejte obsluhu události value-changed widgetu adjustment1.
Použijte vzor programu. Do zdrojového kódu přidejte (například) funkci:
def on_adjustment1_value_changed(self, widget): print self.w("adjustment1").get_value()
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 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"
self.treestore1.append(parent=None, row=(obrazek, text))
Jako parametr parent můžete použít už existující řádek:
## 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"
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)