horizontale Scrollbar für Treeview

Fragen zu Tkinter.
Antworten
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Hallo Leute

Ich habe eine Treeview mit einer Spalte. Der Benutzer kann dann neue Zeilen einfügen.
Damit lange Einträge angezeigt werden können möchte ich eine horizontale Scrollbar.
Sie funktioniert aber leider nicht richtig.
Ich möchte eine maximale Breite:

Code: Alles auswählen

 self.column("#0", width=400)
Wenn ich jetzt ein neuer zu langer Text einfüge wir er aber einfach nur abgeschnitten.
Was könnte das Problem sein?

Danke im Voraus
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Ich empfehle ein minimales, ausführbares Beispiel, das dein Problem zeigt. Nicht nur eine Zeile Code.
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Ich erstelle die Scrollbars so:

Code: Alles auswählen

        self.scrollbar_vertical = ttk.Scrollbar(self, orient="vertical", command=self.hierarchical_view.yview)
        self.scrollbar_vertical.grid(row=0, column=1, sticky="nsew")

        self.scrollbar_horizontal = ttk.Scrollbar(self, orient="horizontal", command=self.hierarchical_view.xview)
        self.scrollbar_horizontal.grid(row=1, column=0, sticky="nsew")

        self.hierarchical_view.configure(yscrollcommand=self.scrollbar_vertical.set, xscrollcommand=self.scrollbar_horizontal.set)
Die Zeilen füge ich mit treeview.insert ein.
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Soll ich meinen vorherigen Post wiederholen und aus "eine Zeile Code" "fünf Zeilen Code" machen?

Ich freue mich über deinen Optimismus, dass zufällig jemand vorbei kommt, der genau deine Frage beantworten kann. Aber die Wahrscheinlichkeit würde wohl steigen, wenn du ein minimales, lauffähiges Beispiel zeigen würdest. Zumindst ich bin nicht bereit, ein Programm um deine 5 Zeilen Code zu bauen, das es mir ermöglicht, das zu testen.

Demnach: Viel Glück!
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

@sparrow
Also. Hier mal ein vollständiges, lauffähiges Beispiel, das mein Problem demonstriert:

Code: Alles auswählen

import tkinter as tk

from tkinter import ttk

def main():
    root = tk.Tk()

    treeview = ttk.Treeview(root)
    treeview.config(show="tree", height=38)
    treeview.column("#0", width=250)
    treeview.grid(row=0, column=0, sticky="nsew")

    scrollbar_vertical = ttk.Scrollbar(root, orient="vertical", command=treeview.yview)
    scrollbar_vertical.grid(row=0, column=1, sticky="nsew")

    scrollbar_horizontal = ttk.Scrollbar(root, orient="horizontal", command=treeview.xview)
    scrollbar_horizontal.grid(row=1, column=0, sticky="nsew")

    treeview.configure(yscrollcommand=scrollbar_vertical.set, xscrollcommand=scrollbar_horizontal.set)

    for _ in range(50):
        treeview.insert(parent="", index="end", text="ggggggggggggggggggggggggggggggggggggggggggggggggg")

    root.mainloop()

if __name__ == "__main__":
    main()
Wie man sehen kann funktioniert nur die vertikale Scrollbar.
Wie bringe ich die Horizontale auch zum laufen?
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Hallo Fire Spike,
ich denke nicht, dass es möglich ist eine Spalte in Treeview horizontal zu scrollen.
Warum nimmst Du nicht eine Listbox?

Code: Alles auswählen

import tkinter as tk

def main():    
    root = tk.Tk()
    listbox = tk.Listbox(root, width=20, height=50)    
    listbox.grid(row=0, column=0, sticky="nsew")
    scrollbar_vertical = tk.Scrollbar(root, orient="vertical",
                                       command=listbox.yview)
    scrollbar_vertical.grid(row=0, column=1, sticky="ns")
    scrollbar_horizontal = tk.Scrollbar(root, orient="horizontal",
                                         command=listbox.xview)
    scrollbar_horizontal.grid(row=1, column=0, sticky="we")
    listbox.configure(yscrollcommand=scrollbar_vertical.set)
    listbox.configure(xscrollcommand=scrollbar_horizontal.set)
    
    for i in range(100):
        zeilentext = 20*(f'{i} ')
        listbox.insert('end', zeilentext)    

    root.mainloop()

if __name__ == "__main__":
    main()
Gruss Peter
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Ich brauche die Funktion um Elemente unterordnen zu können. Und das geht soweit ich weiss nur mit der TreeView.
Aber vielen Dank für deine Antwort.
Vielleicht kennst du ja noch eine andere Option.
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Hallo Fire Spike,
Fire Spike hat geschrieben: Sonntag 4. September 2022, 18:53 Ich habe eine Treeview mit einer Spalte.
Fire Spike hat geschrieben: Mittwoch 7. September 2022, 14:28 Ich brauche die Funktion um Elemente unterordnen zu können.
Und was bedeutet unterordnen?
Willst Du mehrere Spalten? Du hast aber in deinem Treeview nur eine.
Wenn es mehrere Spalten braucht, dann setz doch mehrere Listboxen nebeneinander.
Gruss Peter
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

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

Wenn tkinter Konstanten definiert hat, sollte man die auch verwenden.
Dein Grid reagiert noch nicht auf Änderung der Fenstergröße. Dazu muß man es passend konfiguriert werden.
Eine Treeview-Spalte ändert ihre Breite dynamisch, je nachdem, wie breit das Widget ist, will man also eine Horizontale Scrollbar, muß man das explizit ausschalten.

Code: Alles auswählen

import tkinter as tk
from tkinter import ttk

def main():
    root = tk.Tk()

    treeview = ttk.Treeview(root)
    treeview.column("#0", stretch=False, width=500)
    treeview.config(show="tree")
    treeview.grid(row=0, column=0, sticky=tk.NSEW)

    scrollbar_vertical = ttk.Scrollbar(root, orient=tk.VERTICAL, command=treeview.yview)
    scrollbar_vertical.grid(row=0, column=1, sticky=tk.NS)

    scrollbar_horizontal = ttk.Scrollbar(root, orient=tk.HORIZONTAL, command=treeview.xview)
    scrollbar_horizontal.grid(row=1, column=0, sticky=tk.EW)

    treeview.configure(yscrollcommand=scrollbar_vertical.set, xscrollcommand=scrollbar_horizontal.set)

    for _ in range(50):
        treeview.insert(parent="", index="end", text=f"{_}"*50)

    root.grid_rowconfigure(0, weight=1)
    root.grid_columnconfigure(0, weight=1)
    root.geometry('200x200') 
    root.mainloop()

if __name__ == "__main__";
    main()
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Danke für deine Mühen. Der Code hat aber leider noch ein Problem.
Das Fenster sollte eine feste Grösse haben. Die Treeview auch. Alles was dann nicht angezeigt werden kann, weil es zu lange ist sollte man scrollen können.
Wenn ich bei dir also einen Text mit der Länge 200 reinmache, kann ich einen Teil immer noch sehen. Sonst müsste ich die "width" ja höher einstellen.
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Wenn du mit festen Fenstergrößen arbeitest, machst du etwas falsch. Wahrscheinlich auch, wenn du mit festen Elementgrößen arbeitest. Wie "groß" etwas dargestellt wird, hängt von verschiedenen Faktoren des Systems ab. Nur weil das bei dir von der Größe passt, muss das auf einem anderen System nicht identisch sein.
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Aber auch wenn ich mit dynamischen Grössen arbeite muss ich "width" manuell anpassen.
Antworten