ttk.treeview scrollen ohne die Selektion zu veraendern

Fragen zu Tkinter.
Antworten
Maschinenhans
User
Beiträge: 20
Registriert: Donnerstag 14. Juli 2011, 12:23

Hallo und guten Tag,

ich wende mich mal wieder hilfesuchend an dieses Forum, da ich in anderen Quellen (Doku, Google, Buecher und stack overflow) leider nicht fuendig wurde.

Ich habe ein ttk.treeview und moechte dieses per Tasten Scrollen, ohne die selektion zu veraendern. Leider finde ich keine brauchbaren Informationen dazu.

Um das ein bisschen eindeutiger zu machen, habe ich -unten- ein Minimalbeispiel geschrieben. Am liebsten waere mir ein Zeiger auf die entsprechende Dokumentation. Vielleicht muss man mich auch einfach mit dem Gesicht rein stupsen :? .

Vielen Dank im voraus fuer die Muehe.

Minimalbeispiel:

Code: Alles auswählen

#!/usr/bin/env python3

# File:        treeview_test.py
# Autor:       Maschinenhans (maschinenhans@gmx.net)
# Description: 
# License:     This code is free to use. Do what you want with it.

import tkinter as tk
from tkinter import ttk

class FrmMain():

    def __init__(self, master):
        self.master = master

        self.test_list = ttk.Treeview(columns=('id', 'name'), 
                    show='headings')

        self.test_list.heading(0, text='ID')
        self.test_list.heading(1, text='Name')

        for i in range(1000):
            self.test_list.insert('', 'end', i, values=(i, 
                    'Eintrag Nr. {}'.format(i)))
        self.test_list.pack(fill='both', expand=True)

    def keys(self, event):
        if event.keysym == 'q':
            self.master.destroy()
        
        if event.keysym == 'Home':
            # Und hier ist das Problem
            print('Jetzt soll er an den Anfang der Liste springen, ohne '\
                    'die Selektion zu veraendern')

def main():
    app = tk.Tk()
    frm_main = FrmMain(app)
    app.bind('<Key>', frm_main.keys)
    app.mainloop()

if __name__ == '__main__':
    main()
Alles wird gut.
BlackJack

@Maschinenhans: Suchst Du eventuell die `see()`-Methode?
Maschinenhans
User
Beiträge: 20
Registriert: Donnerstag 14. Juli 2011, 12:23

Vielen Dank, BlackJack. Das ist es wohl.

Also die Doku besser lesen und verstehen :roll: .

Der Vollstaendigkeit halber noch eine Loesung "fuer das Protokoll":

Code: Alles auswählen

...
    def keys(self, event):
        if event.keysym == 'q':
            self.master.destroy()
        
        if event.keysym == 'Home':
            # Und hier ist das Problem
            #print('Jetzt soll er an den Anfang der Liste springen, ohne '\
            #        'die Selektion zu veraendern')
            self.test_list.see(item=1)
...
Alles wird gut.
Maschinenhans
User
Beiträge: 20
Registriert: Donnerstag 14. Juli 2011, 12:23

Noch ein Nachtrag:

Da die see()-Methode nur sicherstellt, das die Zeile im sichbaren Bereich liegt, habe ich weitergelesen und bin auf yview() gestossen.

Mit dem code unten scrollt man dann auch wirklich an die erste Zeile:

Code: Alles auswählen

...
def keys(self, event):
        if event.keysym == 'q':
            self.master.destroy()
        
        if event.keysym == 'Home':
            self.test_list.yview(0)
...
Damit kann man dann auch die Verbindung zu einem Scrollbalken herstellen, wenn man moechte.

Gruss
Maschinenhans
Alles wird gut.
Antworten