Horizontale Scrollbar abhängig von der Textbreite machen

Fragen zu Tkinter.
Antworten
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

hallo
wenn man die fensterkante varriiert, springt die yScrollbar wunderbar an.
auch die xScrollbar spring an, wenn die header breite unterschritten wird.
wie kann ich die xScrollbar nun noch von der gezeigten textlänge abhängig machen?
soll heißen: die xScrollbar soll anspringen, wenn die textlänge die headerbreite überschreitet.

Code: Alles auswählen

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from tkinter import ttk
import tkinter as tk
from tkinter import font as tkFont


class App:
    def __init__(self, master):

        splitter = tk.Frame(master)
        splitter.pack(fill=tk.BOTH, expand=1)

        frame_left = tk.Frame(splitter, width=200)
        frame_left.pack(fill=tk.BOTH, expand=1)
        frame_left.columnconfigure(0, weight=1)
        frame_left.rowconfigure(0, weight=1)

        tree = ttk.Treeview(frame_left, show='tree')
        tree.grid(row=0, column=0, sticky='NSEW')
        tree.heading('#0', text='Header')
        tree.column('#0', minwidth=250, stretch=True)

        ysb = ttk.Scrollbar(frame_left, orient='vertical', command=tree.yview)
        ysb.grid(row=0, column=1, sticky='ns')
        xsb = ttk.Scrollbar(frame_left, orient='horizontal', command=tree.xview)
        xsb.grid(row=1, column=0, sticky='ew')

        len_strings = []
        data = ['Eins',
                'Zwei',
                'Hier ist ein ziemlich langer Text...',
                'Vier',
                'Fünf',
                'Sechs',
                'Sieben'
                ]

        for idx_item, item in enumerate(data):
            if idx_item % 2 == 0:
                # print(tkFont.Font().measure(item))
                len_strings.append(tkFont.Font().measure(item))

                tree.insert('', 'end', text=item, tags=('odd',))
            else:
                tree.insert('', 'end', text=item, tags=('even',))
            tree.tag_configure('odd', background='#E8E8E8')
            tree.tag_configure('even', background='#DFDFDF')

        highest = max(len_strings)
        print("Längste Textlänge: " + str(highest))

        tree.configure(xscrollcommand=lambda f, l: self.auto_SCROLL(xsb, f, l),
                                  yscrollcommand=lambda f, l: self.auto_SCROLL(ysb, f, l))

    @staticmethod
    def auto_SCROLL(sbar, first, last):
        first, last = float(first), float(last)
        if first <= 0 and last >= 1:
            sbar.grid_remove()
        else:
            sbar.grid()
        sbar.set(first, last)


if __name__ == '__main__':

    root = tk.Tk()
    root.geometry("500x200+400+250")
    app = App(root)
    root.mainloop()

jede hilfe/tipp ist herzlich willkommen :lol:
Antworten