Treeview CellRendererToggle änder alle Zeilen

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

Hallo,

ich habe ein Problem mit dem gtk CellRendererToggle Widget. Dieses ist mit einer Funktion verbunden, dass bei einem Klick den Zustand von aktiv auf inaktiv ändert. Leider wird dieser Zustand dann in allen Zeilen angenommen. Ich bin da noch nicht ganz drin. Hier der Code:

Code: Alles auswählen

for n, header_text in enumerate(["Aktive", "Quantity", "Warning", "Sellout", "Keep"]):
    if header_text in ["Aktive", "Sellout"]:
        cell = gtk.CellRendererToggle()
        cell.set_property('activatable', True)
        cell.connect("toggled", self.on_sync_treeview_button_toggled, n, header_text)
        column = gtk.TreeViewColumn(header_text, cell)
    else:
        cell = gtk.CellRendererText()
        cell.set_property('editable', True)
        column = gtk.TreeViewColumn(header_text, cell, text=n)
    column.set_sort_column_id(n)
    self.keep_sync_treeview.append_column(column)
mainbox_left.pack_start(self.keep_sync_treeview, False, False, 0)

for i in range(1,3):
    self.keep_sync_liststore.append([False, 1, 10 ,20 False])

Code: Alles auswählen

    def on_sync_treeview_button_toggled(self, widget, path, column, data):        
        widget.set_active( [True,False][widget.get_active()] )
        self.keep_sync_liststore[path][column] = [True, False][widget.get_active()]
Auch bin ich mir nicht sicher, ob ich den Liststore (self.keep_sync_liststore) überhaupt ändern muss. Order wie sinnvoll die Iteration zum Aufbau der Zellen ist.

Freue mich auf eure Kommentare.
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

Also hier muss jedenfalls ne Änderung hin, da ich ja in der Zweiten Zeile das widget schon geänder habe muss ich in der dritten Zeile False und True vertauschen:

Code: Alles auswählen

        def on_sync_treeview_button_toggled(self, widget, path, column, data):        
            widget.set_active( [True,False][widget.get_active()] )
            self.keep_sync_liststore[path][column] = [True, False][widget.get_active()]
Aber noch verstehe ich nicht, warum alle geschalten werden, von vor allem verstehe ich nicht, warum sich zwar alle Zahlen ändern wenn ich den darunterliegenden ListStore verändere, die CellRendererToggle jedoch nicht beeinflusst werden...


Falls Werte in der Datenbank vorhanden sind möchte ich damit den TreeView füllen:

Code: Alles auswählen

        if response:
            self.stock_definitions_liststore.clear()
            self.stock_definitions_liststore.append([
                True,
                1,
                int(response[2]),
                int(response[3]),
                int(response[4]),
                int(response[5]),
                int(response[6]),
                True if response[7] else False,
                int(response[8])
                ])
Also die Werte werden eingetragen, der CellRendererToggle in Spalte 1 und 8 bleiben unverändert, ich bekomme nicht mal einen Fehler wenn ich z.B. einen String als Wert gebe...
Antworten