ich habe ein Problem mit Treeview und keine Lösung gefunden, auch nicht im Netz. Benutze Treeview in Verbindung mit Scrollbar und .grid, bei Text ebenfalls mit Scrollbar und .grid ist alles in Ordnung: Unabhängig vom Inhalt und der wrap-Einstellung hab ich ein Textfenster gleichbleibender Größe in einem Rahmen in einem Fenster. Bei Treeview sieht das anders aus: Bei breiten Tabellen läuft Treeview über die rechten Ränder von Fenster und Bildschirm hinaus, d.h. rechte Spalten sind nicht erreichbar, die Scrollbars ebenso bzw. deaktiviert, weil (aus Sicht des Treeview) die Taballe in voller Breite angezeigt wird. Der intgeressante Teil des Codes beginnt mit root = tk.Tk().
Der Code:
Code: Alles auswählen
test = True # True|False = Zugriff auf SQLite
file = 'Ersatzteile.db' #\
table = 'etl_utf' #/
mode = 'grid' # 'grid'|'packh'|'packv'
char_width, base_width = 6.3, 8 # Spaltenbreite
import tkinter as tk
from tkinter import ttk
if test:
data = []
for i in range(5):
data.append(['', 'MAE214613', '', '', 'HW', 'Motorschild 60903', ''])
data.append(['xxxx', 'LGE8.845050.6', '', '', '2m', 'Steckdose 2-polig, Verbindungskabel', 'z.B. Stainz-Tender'])
data.append(['xxxx', 'LGE8.839040.7', '', '', '2m', 'Steckdose 2-polig', 'z.B. Stainz'])
data.append(['xxxx', 'LGE1.22500.170', '', '', '2m', 'Steckdose 2-polig, Halter für 122500.170.2', 'z.B. Stainz'])
columns = ('ort', 'nr', 'stk', 'pg', 'spur', 'bez', 'komm')
else:
import sqlite3
conn = sqlite3.connect(file)
sql_cmd = "PRAGMA TABLE_INFO(" + table + ")"
data = conn.execute(sql_cmd) # ,oid = recno()
columns = [ elem[1] for elem in list(data) ]
sql_cmd = "SELECT * FROM " + table
data = conn.execute(sql_cmd)
col_types = (4, 17, 3, 2, 4, 46, 40)
root = tk.Tk()
root.geometry('650x350')
root.title(file)
root.config(background='magenta')
frame0 = tk.Frame(root, background='yellow')
frame1 = tk.Frame(frame0, background='red')
tree = ttk.Treeview(frame1)
tree['show'] = 'headings' # suppress white spaces left of columns
tree['selectmode'] = 'browse' # select one line at a time only
tree['columns'] = columns
for i, col in enumerate(columns):
width = int(col_types[i] * char_width + base_width)
tree.column(col, width=width, anchor='w')
tree.heading(col, text=col, anchor='w')
for i, row in enumerate(data):
tree.insert('', i, text='', values=(row))
if mode == 'packh':
xbar = ttk.Scrollbar(frame0, orient='horizontal')
ybar = ttk.Scrollbar(frame1, orient='vertical')
elif mode == 'packv':
xbar = ttk.Scrollbar(frame1, orient='horizontal')
ybar = ttk.Scrollbar(frame0, orient='vertical')
elif mode == 'grid':
xbar = ttk.Scrollbar(frame1, orient='horizontal')
ybar = ttk.Scrollbar(frame1)
ybar.configure(command=tree.yview)
tree.configure(yscrollcommand=ybar.set)
xbar.configure(command=tree.xview)
tree.configure(xscrollcommand=xbar.set)
if mode == 'packh':
tree.pack(side='left')
ybar.pack(side='right', fill='y')
frame1.pack(padx=10, pady=10)
xbar.pack(fill='x')
frame0.pack(padx=20, pady=20)
elif mode == 'packv':
tree.pack()
xbar.pack(fill='x')
frame1.pack(side='left', padx=10, pady=10)
ybar.pack(side='right', fill='y')
frame0.pack(padx=20, pady=20)
elif mode == 'grid':
tree.grid(row=2, column=1)
xbar.grid(row=3, column=1, sticky='we')
ybar.grid(row=2, column=2, sticky='ns')
frame0.grid(row=0, column=0, padx=10, pady=10)
frame1.grid() # padx=10, pady=10
root.mainloop()