Seite 1 von 1

horizontale Scrollbar für Treeview

Verfasst: Sonntag 4. September 2022, 18:53
von Fire Spike
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

Re: horizontale Scrollbar für Treeview

Verfasst: Sonntag 4. September 2022, 20:17
von sparrow
Ich empfehle ein minimales, ausführbares Beispiel, das dein Problem zeigt. Nicht nur eine Zeile Code.

Re: horizontale Scrollbar für Treeview

Verfasst: Sonntag 4. September 2022, 20:29
von Fire Spike
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.

Re: horizontale Scrollbar für Treeview

Verfasst: Sonntag 4. September 2022, 20:53
von sparrow
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!

Re: horizontale Scrollbar für Treeview

Verfasst: Dienstag 6. September 2022, 19:54
von Fire Spike
@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?

Re: horizontale Scrollbar für Treeview

Verfasst: Mittwoch 7. September 2022, 13:59
von peterpy
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

Re: horizontale Scrollbar für Treeview

Verfasst: Mittwoch 7. September 2022, 14:28
von Fire Spike
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.

Re: horizontale Scrollbar für Treeview

Verfasst: Mittwoch 7. September 2022, 15:10
von peterpy
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

Re: horizontale Scrollbar für Treeview

Verfasst: Mittwoch 7. September 2022, 16:05
von Fire Spike

Re: horizontale Scrollbar für Treeview

Verfasst: Mittwoch 7. September 2022, 19:58
von Sirius3
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()

Re: horizontale Scrollbar für Treeview

Verfasst: Donnerstag 8. September 2022, 16:38
von Fire Spike
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.

Re: horizontale Scrollbar für Treeview

Verfasst: Donnerstag 8. September 2022, 16:48
von sparrow
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.

Re: horizontale Scrollbar für Treeview

Verfasst: Donnerstag 8. September 2022, 17:25
von Fire Spike
Aber auch wenn ich mit dynamischen Grössen arbeite muss ich "width" manuell anpassen.