Seite 1 von 1

Entry in Textwidget ausrichten

Verfasst: Montag 7. Juli 2008, 10:46
von Pü-Ton
Hallo,

hier ist ein Beispielcode von Michael,

Code: Alles auswählen


import Tkinter as tk
root = tk.Tk()

# Textwidget statt Canvas, das kann mehr als man denkt
text = tk.Text(root, width=60, height=20)
text.grid(row=2, column=1)

# nur die Scrollbar einfuegen
scroll_y = tk.Scrollbar(root, orient=tk.VERTICAL, command=text.yview)
scroll_y.grid(row=2, column=2, sticky=tk.NS)

# xml-Datendict und variablen-Zwischenspeicher initialisieren
xml_dict = {"Vorname":"Michael", "Nachname":"Ballack", "Position":"Mittelfeld"}
variable_dict = {}

# xml-Daten einfuellen, pro Eintrag eine tk-Variable definieren und ein
#   Entry einfuegen
for tag_name, default_value in xml_dict.iteritems():
    text.insert(tk.END, "%s: "%tag_name)
    tk_var = tk.StringVar()
    tk_var.set(default_value)
    variable_dict[tag_name] = tk_var
    text.window_create(tk.END, window=tk.Entry(text, width=20, textvariable=tk_var))
    text.insert(tk.END, "\n")
   
# Scrollbalken verknuepfen und Textaenderungen unterbinden
text.config(yscrollcommand=scroll_y.set, state=tk.DISABLED)
root.mainloop()

# Ergebnisdict aus den xml-Schluesseln und den tk-Variablen ermitteln
result_dict = dict([(tag, variable_dict[tag].get()) for tag in xml_dict])
print result_dict
kennt jm eine Möglichleit, wie ich das Entry innerhalb des Text-widges auf die rechte Seite bekomme? Also rechtsbündig.

Es soll dann so aussehen, dass "Name" links am Rand steht, und das Entry mit "Ballack" drin rechts am Rand steht?

Verfasst: Montag 7. Juli 2008, 13:22
von numerix
Zeile 21 durch folgende Zeile ersetzen:

Code: Alles auswählen

text.insert(tk.END, ("%s: "+" "*(36-len(tag_name))) %tag_name)
Dadurch werden Leerzeichen eingefügt.

Je nach eingestelltem Zeichensatz - du legst ja nichts fest - musst du den Wert 36 verändert, bis es passt. Das funktioniert aber nur bei fixen Schriften.

Verfasst: Montag 7. Juli 2008, 14:08
von Pü-Ton
Hi numerix,

vielen Dank, für die Hilfe.

Ich hab jetzt einen Vorschlag von Michael versucht, indem dem Textlabel zuerst eine feste Breite gegeben wird, und somit die "Lücke" fest definiert ist.
Rechts davon kommt dann das Entry.

Verfasst: Dienstag 8. Juli 2008, 08:46
von Michael Schneider
Hallo numerix,

ich habe das über einen anderen Formatstring gemacht, kommt aber auf dasselbe raus:

Code: Alles auswählen

    text.insert(tk.END, "%-25s"%(tag_name+":"))
Gruß,
Michael

Verfasst: Dienstag 8. Juli 2008, 09:05
von numerix
Michael Schneider hat geschrieben:ich habe das über einen anderen Formatstring gemacht, kommt aber auf dasselbe raus:

Code: Alles auswählen

text.insert(tk.END, "%-25s"%(tag_name+":"))
Sieht aber besser aus als meine Lösung ... :)

Verfasst: Dienstag 8. Juli 2008, 13:24
von Michael Schneider
Hallo,

noch ein Nachtrag.
Michael Schneider hat geschrieben:

Code: Alles auswählen

    text.insert(tk.END, "%-25s"%(tag_name+":"))
Wenn Du die Einrückungstiefe dynamisch gestalten möchtest, dann ermittelst Du am besten vorab max_length (inkl. Doppelpunkt) und schreibst

Code: Alles auswählen

    text.insert(tk.END, "%-*s"%(max_length, tag_name+":"))
Gruß,
Michael