05 Dezember 2009

Ruby, GTK und TreeView

Aus aktuellem Anlaß habe ich mir mal angesehen, wie man mit Ruby und Gtk eine GUI zusammenschraubt. Ein Teil der Daten, mit denen ich arbeite, soll tabellarisch angezeigt werden, weshalb ich mich damit beschäftigt habe, wie man so eine Tabelle baut und mit Daten füttert. Als kleine Beispielanwendung hab ich mir eine Wettervorhersage geschrieben, die ihre Daten (für Trier) per RSS von yr.no bezieht. Den mit RSS::Parser.parse ausgelesenen Feed habe ich mit ein paar Datumsmethoden, Stringmethoden und regulären Ausdrücken vorverarbeitet und ins Deutsche übersetzt, diese Daten werden dann im GUI als Tabelle angezeigt.
Als Grundgerüst gibt es erst einmal ein normales Fenster mit Gtk::Window.new mit dem einzigen verbundenen Event für ein Gtk.main_quit, darin dann ein Gtk::ScrolledWindow - also alles ganz simpel und beispielhaft gehalten.
Die eigentliche Tabelle als Gtk::TreeView liegt in dem Scrollfenster und beinhaltet vier einfache Textspalten und eine, in der zusätzlich ein Icon angezeigt wird. Für die Texte nutzt man den Gtk::CellRendererText, für das Icon den Gtk::CellRendererPixbuf. Die ganze Spalte wird dann z.B. so erzeugt:

spalte = Gtk::TreeViewColumn.new # neue Spalte
spalte.title = "Wetter" # Spaltentitel setzen
renderer_pix = Gtk::CellRendererPixbuf.new # renderer für das Icon
spalte.pack_start(renderer_pix, false)
spalte.add_attribute(renderer_pix, 'pixbuf', 1) # Icon zur Spalte hinzufügen
renderer_txt = Gtk::CellRendererText.new # renderer für den Text
spalte.pack_start(renderer_txt, true)
spalte.add_attribute(renderer_txt, "text", 2) # Text zur Spalte hinzufügen
treeview.append_column(spalte) # Spalte zum treeview hinzufügen

Für unsere Daten legen wir dann einen einfachen Gtk::ListStore an, in diesem speziellen Fall mit store = Gtk::ListStore.new(String, Gdk::Pixbuf, String, String, String) für die vier Strings und das Icon. Das letzte Attribut in spalte.add_attribute (s.o.) steht dann jeweils für die Position der Daten in dem ListStore.
Die Daten werden Zeile für Zeile mit store.append und store.set_value (einfach per each) in den ListStore geschrieben und danach das Model mit dem View verbunden (treeview.model = store).
Wie man auf dem Bild erkennen kann, werden dann die Wetterdaten in den entsprechenden Zeilen und Spalten der Tabelle angezeigt. Die zweite Spalte enthält den Text aus dem Store (Index 2) und das Icon (Index 1). Die dritte und vierte Spalte sind mit set_property('xalign',1.0) (an den Renderer) jeweils rechtsbündig ausgerichtet.
Die Icons stammen aus dem schönen silk iconset von famfamfam.com.
Tutorials gibt es beim Ruby-Gnome2 Projekt: The TreeView Widget und Ruby/GTK Treeview Tutorial.

Labels: , , , ,

3 Comments:

At 19:43, Anonymous codeschneider said...

Sehr schön, mit genau dem gleichen Thema beschäftige ich mich auch gerade: Treeview in Ruby und hab mich über ein Syntaxbeispiel gefreut.

 
At 20:42, Blogger amorphe Welt said...

Hier mal der ganze Rotz in einem Rutsch (natürlich ohne icons):
http://nopaste.info/3719e314b5.html

Es ist wahrlich nicht schön, aber als kleines Beispiel zum Testen hat es für mich gelangt.

 
At 20:56, Anonymous code said...

hey, danke, genau das hab ich mir noch gewünscht ;). So ein paar funktionierende Beispiele sind ja doch sehr praktisch.

 

Kommentar veröffentlichen

<< Home