Treeview zur letzten Reihe springen und diese Anzeigen

Fragen zu Tkinter.
Antworten
Onomatopoesie
User
Beiträge: 41
Registriert: Montag 12. August 2019, 07:52

Liebe Community, liebe Pythoner und Tkinter-Experten,
ich versuche schon stundenlang mit dem Treeview klar zu kommen bzw. mit der für mich unverständlichen Situation, dass Tkinter den "Viewport" nicht automatisch auf das zuletzt eingefügte Element (bzw. die Reihe) setzt.
Ich habe eine Datenbank (sqlite), wo nach einer Artikelnummer gesucht werden kann. Wird diese gefunden, wird das Ergebnis in eine Tabelle geschrieben (mit Tkinter ist hier wohl nur der Treeview eine sinnvolle, geordnete Option).
Das Programm funktioniert tadellos und ich kann alle Daten in das Tkinter-Widget schreiben. Allerdings stehe ich vor dem Problem, dass die Reihen nicht mehr angezeigt werden, wenn es mehr Reihen sind, als für das Widget vorgesehen sind (in meinem Fall 6). Der siebte Eintrag usw. läuft dann außerhalb der sichtbaren Einträge - ist aber natürlich vorhanden und man kann ihn durch die Tastatur ansteuern. Das möchte ich aber "automatisch" erledigen.
Gefunden habe ich hierzu die Befehle yview_moveto(1.0), yview(Element) oder auch see(). Das funktioniert auch - fast. Es klappt nämlich nur bei jedem zweiten Aufruf. Die Zeile 7 wird nicht automatisch angezeigt, bei Zeile 8 klappt es dann (es werden beide neuen Einträge dargestellt). Zeile 9 dann wieder nicht, bei Zeile 10 klappt es.
Ich finde hierfür einfach keine Lösung und kann es mir nicht erklären.
Hier ein Auszug aus dem Programm (gekürzt):

Code: Alles auswählen

def onReturn(*event):
iid=tree.insert("","end",text=str(nummer+1),
        values=(result[2],result[3]))
        nummer += 1
        tree.selection_set(iid)
        #tree.yview_moveto(1.0)
        tree.yview(nummer)
        
# Treeview
tree=ttk.Treeview(root,height=6)
tree["columns"]=("Artikel","Preis")
tree.column("#0", width=50, stretch=NO)
tree.column("Artikel",width=200, stretch=NO)
tree.column("Preis", width=50, stretch=NO)
tree.heading("#0", text="Pos")
tree.heading("Artikel",text="Artikel")
tree.heading("Preis", text="Preis")
tree.pack()
Gibt es jemanden, der dieses "Problem" kennt und mir helfen kann? Weder googlen, Tutorials noch die Forensuche hat mir bisher die Augen öffnen können.

Danke!
Onomatopoesie
User
Beiträge: 41
Registriert: Montag 12. August 2019, 07:52

Endlich ist der Knoten geplatzt. Es war notwendig, den Treeview mit update() zu "bearbeiten", bevor der neue Viewport gesetzt wird. Jetzt klappt es endlich.
Ich würde ja in den Betreff "gelöst" schreiben, aber leider finde ich keinen Button zum Bearbeiten (vielleicht weil ich neu im Forum bin und so ungeprüft Blödsinn schreiben könnte?).
Vielleicht kann das ein Moderator für mich übernehmen? Vielen Dank. :-)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Machen wir hier nicht. Musst dich also nicht Mühen. Und der Prozess mit wem anderes über sein Problem zu reden und dann selbst auf dir Lösung zu kommen ist nichts ungewöhnliches - auch bekannt unter dem Namen Programmierente. Bin ich regelmäßig für Kollegen.
Onomatopoesie
User
Beiträge: 41
Registriert: Montag 12. August 2019, 07:52

@_deets_: Ja, stimmt. Das kennt man auch aus dem "normalen" Leben. Man spricht über etwas und dabei klären sich die Gedanken in einem selbst. Es war in diesem Fall letztlich ein Monolog, aber der Zweck heiligt die Mittel. :-)
Benutzeravatar
__blackjack__
User
Beiträge: 14092
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Da gibt's auch eine Webseite zu: http://rubberduckdebugging.com/
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
Antworten