Ich habe ein Problem bei der Tabellenausgabe mit StringVar().
Bei meinem jetzigen Konstrukt, wird immer die letzte Zeile der Liste in var übernommen, die vorhergehenden Zeilen werden ignoriert.
Ich habe es lange versucht, das Problem zu lösen, leider ohne Erfolg.
Ich poste hier mal mein Konstrukt, das lauffähig ist und Ihr so Euch einen Überblick verschaffen könnt.
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# For Python3.x
import tkinter as tk
"""Hauptkonfiguration für die GUI Tkinter."""
CONFIG = {
'width' : 0,
'button_width' : 12,
'title' : "Tabelle",
'start_font': ('NimbusSansL', 80), # Startfenster
'info_font': ('NimbusSansL', 40), # Infofenster
'bbig_font': ('NimbusSansL', 14, 'bold'), # Buttons
'btxt_bground': 'darkgrey', # Buttons
'bfont_white': 'white',
'bfont_color': 'darkred',
'big_font': ('NimbusSansL', 14), # Buttons, Texteingabe
'sub_font': ('NimbusSansL', 12), # Buttons, Texteingabe
'txt_font': ('NimbusSansL', 12), # Textausgabe
'txt_bground': 'grey', # Texteingabe, Textfenster, Buttons
'font_color': 'black',
'back_ground' : 'darkgrey'
}
class TabelleWindow(object):
"""Listbox mit Scrollmenü.
Tabellarische Ausgabe der Daten in Spalten.
Tabellenausgabe, mit automatischer Anpassung an die Spaltenanzahl
der jeweiligen Liste.
Aufruf:
TabelleScroll(LISTE, LISTE_FÜR_SPALTENBENENNUNG, MAXIMALE_SPALTENWEITE)
Beispiel:
TabelleScroll(self.data, ['Artikel', 'Benennung', 'Vk'], [10, 60, 4])
LISTE = Liste
LISTE_FÜR_SPALTENBENENNUNG = Liste wie z.B. ['Artikel', 'Benennung', 'Vk']
MAXIMALE_SPALTENWEITE = Liste wie z.B. [10, 60, 4]"""
def __init__(self, result, name, max_width):
self.root = tk.Toplevel()
self.conf = CONFIG
self.root.title(self.conf['title'])
self.result = result
self.label_names = name
self.max_width = max_width
self.frame = tk.Frame(self.root)
self.frame.pack(side='top', expand=False)
self.winLabel = tk.Label(self.frame)
self.winLabel.pack(expand=False)
self.button_frame = tk.Label(self.frame,
bg=self.conf['back_ground'])
self.button_frame.pack()
def set_scrolled_tables(self):
tk.Button(self.button_frame, bg=self.conf['txt_bground'],
width=self.conf['button_width'],
font=(self.conf['big_font']), text="übernehmen",
command=lambda: self.myResult()
).grid(row=0, column=0, sticky=tk.SW)
tk.Button(self.button_frame, bg=self.conf['txt_bground'],
width=self.conf['button_width'],
font=(self.conf['big_font']), text="Schließen",
command=lambda: self.root.destroy()
).grid(row=0, column=1, sticky=tk.SE)
zeilen = len(self.result)
if zeilen == 0:
info('Es sind keine Daten vorhanden!')
return
names = len(self.label_names)
w_max = sum(self.max_width)
h_now = zeilen * 60
h_max = self.root.winfo_screenheight() - 120
if h_now < h_max:
h_max = h_now
self.tabellenWindow = tk.Frame(self.winLabel)
self.tabellenWindow.grid(row=0, column=0, sticky='nswe')
self.tabellenWindow.grid_rowconfigure(0, weight=1)
self.tabellenWindow.grid_columnconfigure(0, weight=1)
## scrollbar erstellen
yscrollbar = tk.Scrollbar(self.tabellenWindow)
yscrollbar.grid(row=0, column=1, sticky='ns')
label_container = tk.Frame(self.tabellenWindow,)
label_container.grid(row=0, column=0,
sticky=tk.NS)
self.entry_vars = [tk.StringVar() for _ in self.label_names]
canvas = tk.Canvas(self.tabellenWindow, bd=0, height=h_max,
scrollregion=(0, 0, h_max, 500),
yscrollcommand=yscrollbar.set)
canvas.grid(row=0, column=0, sticky='nswe')
self.label_frame = tk.Frame(canvas)
xpos = 0
ypos = 0
ENTRY_IPADX = 5 # Abstand zu Text in x
ENTRY_IPADY = 2 # Abstand zu Text in y
if names != '':
labels = list()
for s in range(names):
label = tk.Label(canvas, width=max_width[s],
text=name[s], font=('NimbusSansL', 14),
bg=self.conf['btxt_bground'],
fg=self.conf['bfont_white'],
bd=1, highlightthickness=1, anchor=tk.W)
label.grid(row=0, column=s, padx=ENTRY_IPADX,
pady=ENTRY_IPADY)
canvas.create_window(xpos, ypos, window=label,
anchor='nw')
xpos += label.winfo_reqwidth()
labels.append(label)
xpos = 0
ypos += label.winfo_reqheight()
self.entries = list()
for i, row in enumerate(self.result):
print(i, row)
for s, var in zip(range(names), self.entry_vars):
entry = tk.Entry(canvas, textvariable=var,
width=max_width[s], font=('NimbusSansL', 14),
bg=self.conf['txt_bground'], bd=1,
highlightthickness=1)
entry.grid(row=i, column=s, padx=ENTRY_IPADX,
pady=ENTRY_IPADY)
try:
print(''.join(row[s]))
var.set(''.join(row[s]))
except IndexError:
var.set('IndexError')
self.entries.append(var)
canvas.create_window(xpos, ypos, window=entry,anchor='nw')
xpos += entry.winfo_reqwidth()
xpos = 0
ypos += entry.winfo_reqheight()
yscrollbar = tk.Scrollbar(self.tabellenWindow)
yscrollbar.grid(row=0, column=1, sticky='ns')
yscrollbar.config(command=canvas.yview)
canvas.update_idletasks()
x, y, w, h = canvas.bbox(tk.ALL)
canvas.config(width=w, yscrollcommand=yscrollbar.set)
canvas.config(scrollregion=(x, y, w, h), width=w, height=h_max)
return self.myResult(), self.frame.mainloop()
def myResult(self):
new_data = dict()
for index, entry_var in enumerate(self.entry_vars):
new_data[index] = entry_var.get()
print(new_data)
if __name__ == '__main__':
result = [['TomTom', '4711', 'Hier wird erklärt, was TomTom ist.',
'Ausführliche Beschreibung zu TomTom.'],
['HalloHallo', '102302', 'Benennung Hallo.',
'Ausführliche Beschreibung zu HalloHallo.']]
name = ['Lieferant', 'Artikelnummer', 'Benennung', 'Beschreibung']
max_width = [20, 20, 60, 60]
TabelleWindow(result, name, max_width).set_scrolled_tables()
Grüße Nobuddy