Gtk.TreeStore / Zweite Spalte

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Benutzeravatar
beli3ver
User
Beiträge: 27
Registriert: Mittwoch 2. März 2016, 05:33
Kontaktdaten:

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)

Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@beli3ver: Der `append()`-Aufruf sieht zumindest schon mal falsch aus. Du übergibst da drei Argumente, das sollten aber nur zwei sein.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
beli3ver
User
Beiträge: 27
Registriert: Mittwoch 2. März 2016, 05:33
Kontaktdaten:

Wenn ich das 'None' entferne, bekomme ich folgenden Fehler

Code: Alles auswählen

TypeError: argument parent: Expected Gtk.TreeIter, but got list
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

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?
Benutzeravatar
beli3ver
User
Beiträge: 27
Registriert: Mittwoch 2. März 2016, 05:33
Kontaktdaten:

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?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@beli3ver: Was Du Dir da jetzt ausgegeben hast ist aber nicht das was Du im Code weiter oben an `append()` übergeben hast.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
beli3ver
User
Beiträge: 27
Registriert: Mittwoch 2. März 2016, 05:33
Kontaktdaten:

Doch.

Code: Alles auswählen

print([invoice["InvoiceNumber"], invoice["Date"]])
gibt genau das aus.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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…
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
beli3ver
User
Beiträge: 27
Registriert: Mittwoch 2. März 2016, 05:33
Kontaktdaten:

Jetzt bin ich raus. Verstehe nur Bahnhof.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Schau Dir Dein ›append‹ an, und vergleiche es mit Deinem ›print‹.
Benutzeravatar
beli3ver
User
Beiträge: 27
Registriert: Mittwoch 2. März 2016, 05:33
Kontaktdaten:

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"
	}
]

Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

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
Antworten