Entry in Textwidget ausrichten

Fragen zu Tkinter.
Antworten
Pü-Ton
User
Beiträge: 67
Registriert: Donnerstag 8. Mai 2008, 07:52

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?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
Pü-Ton
User
Beiträge: 67
Registriert: Donnerstag 8. Mai 2008, 07:52

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.
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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 ... :)
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Antworten