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()
Danke!