Seite 1 von 1

CheckButton in einem TreeView

Verfasst: Sonntag 12. Dezember 2004, 12:50
von bmh1980
Ich würde gerne in einem TreeView pro Zeile einen CheckButton einfügen.

Soweit habe ich das auch hinbekommen. Aber die CheckButtons lassen sich nicht aktivieren. Dazu kommt, dass die Textzellen extrem breit sind, obwohl gar nicht so viel Text da ist.

Hier mal mein Code:

Code: Alles auswählen

cellrenderer1 = gtk.CellRendererToggle()
cellrenderer2 = gtk.CellRendererText()
liststore1 = gtk.ListStore(gobject.TYPE_OBJECT, gobject.TYPE_STRING)
treeviewcolumn1 = gtk.TreeViewColumn(None, cellrenderer1)
treeviewcolumn2 = gtk.TreeViewColumn(None, cellrenderer2, text = 1)
treeview1 = gtk.TreeView(liststore1)
for item in [treeviewcolumn1, treeviewcolumn2]:
    treeview1.append_column(item)
treeview1.set_headers_visible(False)
for item in os.listdir(directory):
    checkbutton = gtk.CheckButton()
    liststore1.set(liststore1.append([checkbutton, unicode(item, iso8859_15')]))
In der PyGTK FAQ habe ich zwar eine Anleitung gefunden, wie man das realisiert. Aber leider gibt das nur Fehlermeldungen.

Jedenfalls denke ich mal, dass ich die Zellen edetierbar machen müsste. Oder bin ich da auf dem Holzweg?

Verfasst: Sonntag 12. Dezember 2004, 13:18
von Dookie
Hi bmh1980,

ich hab gerade auch ein Projekt, in dem ich ein Listview mit mehreren Togglebuttons pro Zeile verwende. Dazu habe ich eine Klasse erstellt, die mir das Listview zusammenpfriemelt. Hier sind mal die Relevanten Teile:

Code: Alles auswählen

class RCListView(gtk.TreeView):
    """
        RCListView-Widget handle also the funcitonality to administrate
        the links in the /etc/rc#.d/ directories
    """
    def __init__(self):
        """
            build the widget and all needed objects
        """
        self.model = gtk.ListStore(str, str, bool, bool, bool, bool)
        #self.update() #Daten einlesen
        super(RCListView, self).__init__(self.model)
        self.set_property("rules-hint", True)
        cell = gtk.CellRendererText()
        column = gtk.TreeViewColumn("Name", cell, text=0)
        column.set_property('expand', True)
        self.append_column(column)
        cell = gtk.CellRendererText()
        cell.set_property('editable', EDIT_PRI)
        cell.connect("edited", self.edited_pri, self.model)
        column = gtk.TreeViewColumn("Priority", cell, text=1)
        self.append_column(column)
        for i in xrange(2,6): # definition von 4 Togglebuttons pro Zeile
            cell = gtk.CellRendererToggle()
            cell.set_property('activatable', True)
            cell.connect("toggled", self.toggled_cb, (self.model, i))
            column = gtk.TreeViewColumn("rc%i.d" % i, cell, active=i)
            column.set_property('expand', False)
            self.append_column(column)
        self.get_selection().set_mode(gtk.SELECTION_SINGLE)

    def toggled_cb(self, cell, path, user_data):
        """
            handle activating nad deactivating of startscripts
        """
        model, column = user_data
        model[path][column] = not model[path][column] # toggle on/off
        ....
Du musst cell also activable machen und eine Funktion/Methode definieren die beim Anklicken des Togglebutton diesen aktiviert und deaktiviert.


Gruß

Dookie

Verfasst: Donnerstag 16. Dezember 2004, 00:26
von bmh1980
Hab mir schon beinahe gedacht, dass ich die Zellen editierbar machen muss.

Allerdings habe ich mich jetzt umentschieden. Ich finde, dass der Aufwand im Code in keinster Weise zum Nutzen steht. Vor allem dann, wenn es auch anders geht.

Ich habe mich jetzt dafür entschieden, dass die Einträge in der Liste mit [Strg] ausgewählt werden können. Also eine Mehrfachselektion.

Das Bedarf lediglich zwei/drei Code-Zeilen mehr, als die Standardeinstellung.

Dafür müssen Maus-Freaks halt dafür mal die Tastatur zu Hilfe nehmen. :wink:

Aber trotzdem. Vielen Dank für deine Hilfe.