Seite 1 von 1

Treeview CellRendererToggle änder alle Zeilen

Verfasst: Donnerstag 8. Oktober 2015, 14:10
von martinjo
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.

Re: Treeview CellRendererToggle änder alle Zeilen

Verfasst: Donnerstag 29. Oktober 2015, 18:36
von martinjo
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...