Seite 1 von 1

GtkTreeView - Hintergrundfarbe einer Reihe ändern

Verfasst: Mittwoch 30. Juli 2008, 07:18
von lobo
Problem gelöst: Ich habe den Code unten mit der Lösung aktualisiert. Man muss eigentlich nur die Hintergrundfarbe im ListStore abspeichern und beim "background" Attribut von GtkTreeViewColumn hinterlegen, wo die Farbe im ListStore zu finden ist.

Update: Bin gerade an einer Lösung dran. Anscheinend habe ich das Model / View Konzept von GtkTreeView noch nicht richtig verstanden. Ich habe gerade noch einen hilfreichen Link gefunden. Ich poste die Lösung hier, falls ich es in den nächsten Stunden doch noch selber hinbekomme.

Hi,

ich habe mir gestern den Kopf zerbrochen, wie ich die Hintergrundfarbe einer Reihe in einem GtkTreeView ändern könnte, wenn ein bestimmter Text in einer Zelle der Reihe steht.

Das PyGTK Tutorial und die PyGTK FAQ habe ich schon durchgearbeitet. Im PyGTK FAQ gibt es zwar eine Lösung, wie ich die Farbe einer Spalte ändere, was mir aber nicht weiterhilft, da ich ja eine Reihe einfärben will. Das zweite Problem mit der Lösung aus den FAQ ist, dass ich die Hintergrundfarbe später und nicht beim einfügen der Daten ins GtkTreeView ändern möchte.

Soweit ich das verstanden habe, müsste ich über die CellRenderer der Zellen einer Reihe die Hintergrundfarbe ändern können. Bisher habe ich aber noch nicht die passenden Methoden dazu gefunden. Ich komm immer nur auf Lösungen, bei welchen ich eine Spalte manipulieren kann.

Falls mir hier jemand weiterhelfen kann, wäre ich echt dankbar ;-)

Bisher habe ich nur ein bischen Code zum testen, welches ein GtkTreeView Widget mit 2 Reihen anzeigt.

Code: Alles auswählen

#!/usr/bin/env python
import gtk

class ExampleList:
    (
            COLUMN_URL,
            COLUMN_NAME,
            COLUMN_DESC,
            COLUMN_BGCOL,
    ) = range(4)

    def __init__(self, treeview):
        self.treeview = treeview
        self.liststore = gtk.ListStore(str, str, str, str)
        self.liststore.set_sort_column_id(self.COLUMN_NAME, gtk.SORT_ASCENDING)
        self.treeview.get_selection().set_mode(gtk.SELECTION_SINGLE)

        self.treeview.set_model(self.liststore)

        self.__fill_liststore()
        self.__create_columns()

    def __fill_liststore(self):
        iter = self.liststore.append()
        self.liststore.set(iter,
                            self.COLUMN_URL, "http://www.gnome.org",
                            self.COLUMN_NAME, "GNOME",
                            self.COLUMN_DESC, "Official GNOME Website",
                            self.COLUMN_BGCOL, "lightblue"
                            )

        iter = self.liststore.append()
        self.liststore.set(iter,
                            self.COLUMN_URL, "http://www.gtk.org",
                            self.COLUMN_NAME, "GTK+",
                            self.COLUMN_DESC, "Official GTK+ Website",
                            self.COLUMN_BGCOL, None
                            )

    def __create_columns(self):
        column = gtk.TreeViewColumn("Site")
        self.treeview.append_column(column)
        cell = gtk.CellRendererText()
        column.pack_start(cell, True)
        # Hintergrundfarbe aus 4. Spalte auslesen (COLUMN_BGCOL).
        column.set_attributes(cell, text=self.COLUMN_NAME, background=3)

        column = gtk.TreeViewColumn("Description")
        self.treeview.append_column(column)
        cell = gtk.CellRendererText()
        column.pack_start(cell, True)
        # Hintergrundfarbe aus 4. Spalte auslesen (COLUMN_BGCOL).
        column.set_attributes(cell, text=self.COLUMN_DESC, background=3)

def main():
    window = gtk.Window()
    window.set_title("ListStore Demo")

    treeview = gtk.TreeView()
    e = ExampleList(treeview)

    window.connect("destroy", gtk.main_quit)

    window.add(treeview)
    window.show_all()
    gtk.main()

if __name__ == '__main__':
    main()
Gruss

Jochen