Seite 1 von 1
Text-Widget mit unterschiedlich gefärbten Zeilen - Wie?
Verfasst: Donnerstag 8. April 2010, 22:00
von asdman3000
Hi,
ich wüsste gern, ob es möglich ist bei einem Text-Widget z.B. jede zweite Zeile dunkler als die anderen zu färben. Ich habe schon versucht ein Bild ins Text-Widget einzubinden, konnte aber nicht "drüber" schreiben und hätte es sowieso gern ohne Bild. Falls es nur so geht, wüsste ich gerne, wie man das Bild komplett in den Hintergrund rücken kann.
Danke im Voraus,
asdman3000
Re: Text-Widget mit unterschiedlich gefärbten Zeilen - Wie?
Verfasst: Freitag 9. April 2010, 10:31
von numerix
asdman3000 hat geschrieben:ich wüsste gern, ob es möglich ist bei einem Text-Widget z.B. jede zweite Zeile dunkler als die anderen zu färben.
Ich tendiere zu "ja", wobei das je nach konkretem Anwendungsfall mehr oder weniger hässlich und mehr oder weniger aufwändig wird (es sei denn, ich hätte etwas naheliegendes übersehen).
Es lässt sich prinzipiell mit tags umsetzen. Wie kompliziert diese Umsetzung wird hängt z.B. davon ab, ob mit manuellen Zeilenumbrüchen gearbeitet wird und ob das Textwidget nur im read-only-Mode verwendet wird.
Verfasst: Freitag 9. April 2010, 11:29
von Pascal
Verfasst: Freitag 9. April 2010, 19:51
von problembär
Vielleicht willst Du auch eigentlich eine Tkinter.Listbox ...
Verfasst: Freitag 9. April 2010, 20:55
von asdman3000
Hi,
erstmal danke für die Antworten
Vielleicht willst Du auch eigentlich eine Tkinter.Listbox ...
Nein, es soll ein Textfeld sein, in das der Benutzer mehrzeiligen Text schreiben kann, so wie die Pro/Contra Kästen auf dieser Seite (nur eben zum selber beschriften):
http://www.4players.de/4players.php/dis ... ler_7.html
Ich hab also versucht das ganze mit tags zu machen (thx numerix!), ist aber noch nicht ganz ausgereift. Hier der Script-Ausschnitt:
Code: Alles auswählen
contra = Text(main, height = 12, width = 40, bg = "#f5e5e6", relief = FLAT)
contra.tag_config("redbg", background="red")
contra.insert("1.0", "\n", "redbg")
Dadurch ist die erste Zeile in dem Fall dunkelrot, der Rest hellrot. Wenn ich jetzt allerdings in die Zeile schreib, wird das dunkelrote zusammengeschoben und die Hintergrundfarbe vom Text-Widget (eben das hellrot) kommt darunter vor. Ich könnte ja alles erst nach der Eingabe färben, aber ich möchte es schon wenn es noch leer ist mehrfarbig.
Damit konnte ich nichts anfangen, ich glaub meine Frage war zu ungenau, sry.
Vielen Dank,
asdman3000
Verfasst: Freitag 9. April 2010, 21:30
von Pascal
asdman3000 hat geschrieben:
Damit konnte ich nichts anfangen, ich glaub meine Frage war zu ungenau, sry.
wenn du dort auf der Seite guckst findest du von numerix ein Beispiel, was den Einsatz von Tags im Textwidget zeigt.
Deinen Anforderungen angepasst sie es ungefähr so aus:
Code: Alles auswählen
import Tkinter as tk
root = tk.Tk()
text = tk.Text(root, width=40)
text.pack(padx=5, pady=5)
for i in range(10):
text.insert("0.0","Das ist ein Mustertext! \n")
text.config(bg="white", state="disabled")
text.tag_add("pro","1.0","3.0")
text.tag_add("contra","3.0","9.0")
text.tag_config("pro",foreground="blue", background='green')
text.tag_config("contra",foreground="blue", background='red')
root.mainloop()
Das hilft dir wahrscheinlich nicht mehr weiter, aber ich wollte meine Antwort noch rechtfertigen

Verfasst: Freitag 9. April 2010, 22:15
von numerix
Da die Tags "mitwandern" ist das genannte Beispiel leider nicht so ohne weiteres übertragbar. Solange es keinen Zeilenumbruch (EOL) gibt oder jede Zeile mit einem manuellen Zeilenumbruch beendet wird, geht es noch, wenn beides möglich ist (und wenn man Anwender Text eingeben lässt, ISST das möglich), dann wird es kniffliger.
Verfasst: Freitag 9. April 2010, 22:45
von Pascal
Was spricht eigentlich gegen die Verwendung von 2 Textwidgets?
Verfasst: Freitag 9. April 2010, 22:56
von asdman3000
Was spricht eigentlich gegen die Verwendung von 2 Textwidgets?
Und die kann man so ineinander verschachteln, das jede zweite Zeile vom einen Text-Widget und die anderen vom anderen sind?

Verfasst: Samstag 10. April 2010, 19:59
von Pascal
asdman3000 hat geschrieben:Was spricht eigentlich gegen die Verwendung von 2 Textwidgets?
Und die kann man so ineinander verschachteln, das jede zweite Zeile vom einen Text-Widget
und die anderen vom anderen sind? 
Verzeih mir, dass ich den unterstrichenen Teil der Aussage nicht verstehe.
Dafür hab ich hier mal einfach nachgebaut, dass was du als Vorlage gibst durch den Link.
Code: Alles auswählen
import Tkinter as tk
win = tk.Tk()
tk.Text(win, height=4, width=40).grid(columnspan=2)
pro_frame = tk.LabelFrame(win, text='PRO')
pro_frame.grid(column=0, row=1)
contra_frame = tk.LabelFrame(win, text='CONTRA')
contra_frame.grid(column=1, row=1)
hintergrund = {1: 'dark', 0: 'light'}
pro_entrys = []
contra_entrys = []
for i in range(10):
entry = tk.Entry(pro_frame, bg=hintergrund[i%2]+'green', relief='flat')
entry.grid(row=i)
pro_entrys.append(entry)
entry = tk.Entry(contra_frame, bg=hintergrund[i%2]+'blue', relief='flat')
entry.grid(row=i)
contra_entrys.append(entry)
win.mainloop()
Vielleicht hilft es dir ja...
Verfasst: Samstag 10. April 2010, 23:25
von asdman3000
Hi,
erstmal wegen dem Verständnis, der Satz von mir war ein bisschen komplex

aber mit dem Link is ja alles klar.
Jetzt zu dem Vorschlag das Ganze aus Entry-Widgets zusammenzusetzen:
Ist genau was ich brauche, vielen Dank! Auf die Idee bin ich gar nicht gekommen! Jetzt muss ich nur noch Zeilenumbruch per Eingabetaste einbinden und alles ist perfekt.
Thanks a ton!
asdman3000