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