Leider habe ich es noch nicht hinbekommen, Deinen Code bei mir so zu integrieren, daß in x der Abstand auf der linken Seite im Entry-Feld ist.
Was mir aufgefallen ist 'import tkinter.font as fnt' hat bei mir keine Auswirkung, wird auch nicht benötigt.
Poste hier mal den Code, sollte bei Dir auch funktionieren.
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
try:
#~~ For Python 2.x
import Tkinter as tk
import tkFont as fnt
except ImportError:
#~~ For Python 3.x
import tkinter as tk
import tkinter.font as fnt
CONFIG = {'width' : 0,
'font': ('NimbusSansL', 14),
'font_color': 'black',
'back_ground' : 'orange',
'select_mode': 'single'}
class DataGui:
def __init__(self, default_labels, result, main_title):
self.root = tk.Toplevel()
self.root.title(main_title)
self.conf = CONFIG
self.default_labels = default_labels
self.result = result
xpos = 0
ypos = 0
self.screenx = self.root.winfo_screenwidth()
self.screeny = self.root.winfo_screenheight()
self.root.geometry("%dx%d+%d+%d" % (self.screenx, self.screeny,
xpos, ypos))
self.frame = tk.Frame(self.root)
self.frame.pack(side='top', fill='both', expand=True)
self.root.config()
self.label_names = self.default_labels
self.scr_frame = self.set_scrolled_entries(self.root, self.label_names,
self.result, self.screeny)
self.scr_frame.pack(expand=True)
self.button_frame = tk.Label(self.root, bg=self.conf['back_ground'])
self.button_frame.pack(fill='x', ipady=5)
tk.Button(self.button_frame, text="Abbrechen", font=self.conf['font'],
fg=self.conf['font_color'], highlightthickness=0,
command=self.root.destroy,).pack(side='right', padx=4)
tk.Button(self.button_frame, text="Übernehmen", font=self.conf['font'],
fg=self.conf['font_color'], highlightthickness=0,
command='').pack(side='right', padx=4)
def set_scrolled_entries(self, parent, label_names, result, screeny):
self.entries = list()
scroll_frame = tk.Frame(parent, bg='red')
canvas = tk.Canvas(scroll_frame, highlightthickness=0)
canvas.grid(row=0, column=0, sticky=tk.NSEW)
yscroll = tk.Scrollbar(scroll_frame, orient=tk.VERTICAL,
command=canvas.yview)
yscroll.grid(row=0, column=1, sticky=tk.NS)
canvas.config(yscrollcommand=yscroll.set)
scroll_frame.grid_rowconfigure(0, weight=1)
self.canvas = canvas
self.bind_scroll(yscroll, self.y_scroll)
label_frame = tk.Frame(canvas)
for i, name in enumerate(self.label_names):
entry_var = tk.StringVar()
label_container = tk.Frame(label_frame,)
label_container.grid(row=i, column=0, padx=10, pady=10, sticky=tk.NW)
label = tk.Label(label_container, text=name, font=self.conf['font'])
label.grid(ipady=5, sticky=tk.W)
bg = ('grey', 'grey')[i & 1]
entry_container = tk.Frame(label_frame,relief='sunken', bd=1)
entry_container.grid(row=i, column=1, padx=5, pady=10,sticky=tk.NE)
entry = tk.Entry(entry_container, textvariable=entry_var, width=70,
font=self.conf['font'], bg=bg, bd=0, highlightthickness=0)
entry.grid(ipadx=5, ipady=5)
try:
entry_var.set(''.join([row[i] for row in [result]]))
except IndexError:
entry_var.set('IndexError')
self.entries.append(entry_var)
canvas.create_window(0, 0, window=label_frame, anchor=tk.NW)
canvas.update_idletasks()
x, y, w, h = label_frame.bbox(tk.ALL)
h_max = h
if h > (self.screeny - 150):
h_max = (self.screeny - 150)
canvas.config(scrollregion=(x, y, w, h), width=w, height=h_max)
return scroll_frame
def bind_scroll(self, widget, mode):
#~~ Windows
widget.bind("<MouseWheel>", mode)
#~~ Linux
widget.bind("<Button-4>", mode)
widget.bind("<Button-5>", mode)
def y_scroll(self, event):
if event.num == 5 or event.delta < 0:
self.canvas.yview_scroll(1, "unit")
elif event.num == 4 or event.delta > 0:
self.canvas.yview_scroll(-1, "unit")
def run(self):
self.root.mainloop()
if __name__ == '__main__':
try:
DataGui(default_labels, result, main_title).run()
except NameError:
result = ['TomTom', '4711', 'Hier wird erklärt, was TomTom ist.',
'Ausführliche Beschreibung zu TomTom. Diese Beschreibung ist \
sooooooooooooooooooooo laaaaaaaaaaaaannnnnnnnnnnnnng, daß es nicht in \
eine Zeile hinein passt!', 'TomTom', '4711', 'Stück', '1', '49,90', '42,90']
default_labels = ['Lieferant', 'Artikelnummer', 'Benennung',
'Beschreibung', 'Hersteller', 'Herstellernummer',
'VE', 'Inhalt', 'Vk', 'Ek']
main_title = 'Produktdaten'
DataGui(default_labels, result, main_title).run()
Ein Beispiel mit überlangem Text, ist auch enthalten.