Seite 1 von 1

Gtk.TreeStore / Zweite Spalte

Verfasst: Donnerstag 20. Juni 2019, 18:33
von beli3ver
Guten Abend.

Ich bin gerade ziemlich am verzweifeln und ich hoffe ich könnt mir weiter helfen.
Und zwar will ich ein TreeStore erstellen, wo in der ersten Spalte die Rechnungsnummer steht und in der zweiten das Rechnungsdatum.
Die beiden Spalten werden angezeigt, jedoch wird in beiden Spalten die Rechnungsnummer angezeigt, und ich kann mir nicht erklären warum.
Könnt ihr mir da vielleicht weiterhelfen?

Code: Alles auswählen

    def __init__(self):
        Gtk.Window.__init__(self, title="Invoicy")
        self.set_border_width = 10
        self.set_default_size(500, 400)
        
        treestore = Gtk.TreeStore(str, str)
        
        a = dbFiles.dbFiles()
        invoices = a.getallinvocies()
        
        for invoice in invoices:
            treestore.append(None, [invoice['InvoiceNumber']], [invoice['Date']])
            
        treeview = Gtk.TreeView(treestore)
        
        renderer = Gtk.CellRendererText()
        col_number = Gtk.TreeViewColumn('Number', renderer, text=0)
        col_date = Gtk.TreeViewColumn('Date', renderer, text=0)
        treeview.append_column(col_number)
        treeview.append_column(col_date)
        
        cell = Gtk.CellRendererText()
        col_number.pack_start(cell, True)
        self.add(treeview)


Re: Gtk.TreeStore / Zweite Spalte

Verfasst: Donnerstag 20. Juni 2019, 19:15
von __blackjack__
@beli3ver: Der `append()`-Aufruf sieht zumindest schon mal falsch aus. Du übergibst da drei Argumente, das sollten aber nur zwei sein.

Re: Gtk.TreeStore / Zweite Spalte

Verfasst: Donnerstag 20. Juni 2019, 19:29
von beli3ver
Wenn ich das 'None' entferne, bekomme ich folgenden Fehler

Code: Alles auswählen

TypeError: argument parent: Expected Gtk.TreeIter, but got list

Re: Gtk.TreeStore / Zweite Spalte

Verfasst: Donnerstag 20. Juni 2019, 19:33
von Sirius3
Naja, jetzt zu raten, welches Argument da nicht hingehört, führt Dich nicht zum Ziel. Hast Du schonmal in der Dokumentation gelesen?

Warum glaubst Du, was die Listen mit je einem Element bedeuten?

Re: Gtk.TreeStore / Zweite Spalte

Verfasst: Donnerstag 20. Juni 2019, 19:50
von beli3ver
Ja habe ich:
https://developer.gnome.org/pygtk/stabl ... re--append

Code: Alles auswählen

parent :
	a gtk.TreeIter, or None

row :
	a tuple or list containing ordered column values to be set in the new row
Ok es macht keinen Sinn, das 'None' zu entfernen :-)
Habe mir jetzt mal die List mit print ausgeben lassen, dann sieht sie so aus:

Code: Alles auswählen

['R-151515', '10-15-20']
['R-151516', '11-15-20']
Sie für mich ok aus, oder habe ich jetzt einen Denkfehler?

Re: Gtk.TreeStore / Zweite Spalte

Verfasst: Donnerstag 20. Juni 2019, 20:15
von __blackjack__
@beli3ver: Was Du Dir da jetzt ausgegeben hast ist aber nicht das was Du im Code weiter oben an `append()` übergeben hast.

Re: Gtk.TreeStore / Zweite Spalte

Verfasst: Donnerstag 20. Juni 2019, 20:18
von beli3ver
Doch.

Code: Alles auswählen

print([invoice["InvoiceNumber"], invoice["Date"]])
gibt genau das aus.

Re: Gtk.TreeStore / Zweite Spalte

Verfasst: Donnerstag 20. Juni 2019, 20:31
von __blackjack__
@beli3ver: Nein.

Das ``print(…)`` gibt etwas anderes aus als Du beim `append()` übergeben hast. Beim `append()` hast Du *3* Argumente übergeben. Ziehen wir das `None` ab, sind es noch *2* Argumente. Bei dem `print()` hier übergibst Du aber nicht *2* Argumente, sondern nur *1* Argument. Und das wäre das richtige zweite Argument für `append()`. Da übergibst Du aber etwas anderes…

Re: Gtk.TreeStore / Zweite Spalte

Verfasst: Donnerstag 20. Juni 2019, 21:34
von beli3ver
Jetzt bin ich raus. Verstehe nur Bahnhof.

Re: Gtk.TreeStore / Zweite Spalte

Verfasst: Donnerstag 20. Juni 2019, 21:39
von Sirius3
Schau Dir Dein ›append‹ an, und vergleiche es mit Deinem ›print‹.

Re: Gtk.TreeStore / Zweite Spalte

Verfasst: Freitag 21. Juni 2019, 04:26
von beli3ver
Ok, jetzt habe ich es gesehen.
Vor lauter Klammern. Entsprechend so sieht es jetzt aus:

Code: Alles auswählen

        for invoice in invoices:
            print([invoice["InvoiceNumber"], invoice["Date"]])
            treestore.append(None, [invoice['InvoiceNumber'], invoice['Date']])
Trotzdem bleibt es bei diesem Ergebnis:

Bild
Habe jetzt auch nochmal die Doku gewälzt und den Code noch aufgeräumt, aber immer noch das selber Ergebnis:

Code: Alles auswählen

        treestore = Gtk.TreeStore(str, str)

        a = dbFiles.dbFiles()
        invoices = a.getallinvocies()


        for invoice in invoices:
            treestore.append(None, [invoice['InvoiceNumber'], invoice['Date']])

        treeview = Gtk.TreeView(treestore)
        renderer_number = Gtk.CellRendererText()
        renderer_date = Gtk.CellRendererText()

        col_number = Gtk.TreeViewColumn('Number', renderer_number, text=0)
        col_date = Gtk.TreeViewColumn('Date', renderer_date, text=0)

        treeview.append_column(col_number)
        treeview.append_column(col_date)

        self.add(treeview)
 
Hier auch nochmal die Klasse mit der ich die Daten hole:

Code: Alles auswählen


    def getallinvocies(pathInvoicy):
        userhome = str(Path.home())
        with open(userhome + '/.config/com.github.beli3ver.invoicy/invoices.json', 'r') as f:
            file = json.load(f)
        return file


Und hier das .json file

Code: Alles auswählen

[
	{
		"InvoiceNumber": "R-151515",
		"Date": "10-15-20"
	},
	{
		"InvoiceNumber": "R-151516",
		"Date": "11-15-20"
	}
]


Re: Gtk.TreeStore / Zweite Spalte

Verfasst: Freitag 21. Juni 2019, 09:38
von Sirius3
Was erwartest Du, wenn Du jedem ›TreeViewColumn‹ sagst, dass es die erste Spalte anzeigen soll?

Warum benutzt Du `Path.home()` stückelst dann aber den Pfad per String + zusammen?
Dateinamenstrings sollten auch nicht irgendwo in einer Funktion stehen, sondern als Konstante am Anfang der Datei. Beim Öffnen sollte man immer ein Encoding angeben, oder da Du json-Daten liest, die Datei binär öffnen.
Der Variablenname ›file‹ hat so gar nichts mit seinem Inhalt zu tun.
Halt Dich an die Namenskonvention.

Code: Alles auswählen

INVOICE_FILENAME = Path.home() / '.config' / 'com.github.beli3ver.invoicy' / 'invoices.json'
def read_all_invoices(path_invoicy):
        with open(INVOICE_FILENAME, 'rb') as f:
            invoices = json.load(f)
        return invoices