CheckButton in einem TreeView

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
bmh1980
gelöscht
Beiträge: 60
Registriert: Montag 26. Januar 2004, 17:13
Kontaktdaten:

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?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
bmh1980
gelöscht
Beiträge: 60
Registriert: Montag 26. Januar 2004, 17:13
Kontaktdaten:

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.
Antworten