Text-Widget mit unterschiedlich gefärbten Zeilen - Wie?

Fragen zu Tkinter.
Antworten
asdman3000
User
Beiträge: 17
Registriert: Donnerstag 1. April 2010, 15:05

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

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.
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

problembär

Vielleicht willst Du auch eigentlich eine Tkinter.Listbox ...
asdman3000
User
Beiträge: 17
Registriert: Donnerstag 1. April 2010, 15:05

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
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

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

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.
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

Was spricht eigentlich gegen die Verwendung von 2 Textwidgets?
asdman3000
User
Beiträge: 17
Registriert: Donnerstag 1. April 2010, 15:05

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? :D
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

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? :D
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...
asdman3000
User
Beiträge: 17
Registriert: Donnerstag 1. April 2010, 15:05

Hi,

erstmal wegen dem Verständnis, der Satz von mir war ein bisschen komplex :D 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
Antworten