|
|
|
|
|
|
|
|
|
|
|
|
Textfenster stellen in Tkinter die Funktionen eines Texteditors zur Verfügung: Man kann Zeilen markieren, kopieren, löschen, einfügen oder nach Worten bzw. Zeichenfolgen suchen. Ein Beispiel:
from Tkinter import * ## Tkinter importieren root=Tk() ## Wurzelfenster! textfenster = Text(root) ## Ein Textfenster erzeugen textfenster.pack() ## und anzeigen
Ergebnis:

Beim Aufruf der Methode Text() können wahlweise jede Menge Argumente übergeben werden, diese Eigenschaften verändern das Aussehen des Textfensters (Tkinter arbeitet mit sinnvollen Voreinstellungen!):
height bzw. width: Bestimmt Höhe bzw. Breite des Textfensters in Zeichen, Text(height=20,width=90)
background: Bestimmt die Hintergrundfarbe des Textfensters, Text(background='white')
foreground: Bestimmt die Vordergrundfarbe des Textfensters, Text(foreground='blue')
font: Bestimmt den Schriftfont des Textfensters, Text(font='courier')
Was fehlt, ist der Titel: Der Titel ist aber keine Eigenschaft des Textfensters, sondern des Toplevel-Widgets (anschaulich: die "Mutter" aller Widgets), Beispiel:
root = Tk() ## Toplevel-Widget
root.title('Chatten mit Python') ## Titel festlegen
Das Toplevel-Widget root wird als Argument dem Textfensters übergeben, man nennt das eine Hierarchie von Objekten:
zuoberst das Toplevel-Widget, dem Toplevel-Widget zugeordnet ist das Textfenster, dem Textfenster zugeordnet ist ein Popup-Menü und so weiter.
Beispiel: Text(root,height=20,width=90)
Aus der Vielfalt der Methoden eine kleine Auswahl:
get('1.0',END): holt den Text aus dem Textfenster ab der Position 1.0 bis zum ENDe, die Schreibweise '1.0' steht für die 1. Zeile und die 0. Spalte.textfenster.get('1.0',END) (holt den ganzen Text!)textfenster.get('1.0','1.end') (holt 1. Zeile)insert(END,'Text-Widgets in Tkinter'): fügt den Text 'Text-Widgets in Tkinter' an der Position END ein.textfenster.insert('2.end','Text-Widgets in Tkinter') delete('1.0','1.end'): löscht die erste Zeiletextfenster.delete('1.0',END) (löscht den gesamten Text!)see(END) bzw. yview(END): Beide Methoden scrollen den Text so, dass der Index (hier: END) sichtbar ist, bei yview(END) wandert der Index im Fenster zusätzlich nach oben.textfenster.see(END) Weitere Methoden zeigt die folgende Sitzung (zu text_03.py)
>>> textfenster.mark_set("eins","1.end") # Marke 'eins' setzen
>>> textfenster.mark_names()
('insert', 'eins', 'current')
>>> textfenster.index('eins') # Index der Marke
'1.23'
>>> textfenster.index('insert')
'3.19'
>>> textfenster.index('current')
'3.19'
>>> textfenster.search('Python',END) # Text 'Python' suchen
'2.6'
>>> textfenster.get('2.6','2.end') # und ausgeben
'Python'
>>> textfenster.tag_add('Bunt','2.6','2.end') # tag 'Bunt' erzeugen
>>> textfenster.tag_config('Bunt',foreground='red') # Python in rot
>>> textfenster.tag_config('Bunt',foreground='green') # Python in grün
>>> textfenster.tag_config('Bunt',foreground='blue') # Python in blau
>>> textfenster.tag_names()
('sel', 'Bunt')
<<<
Eingabezeilen sind so etwas ähnliches wie ein einzeiliges Text-Widget, Beispiel:
from Tkinter import * ## Tkinter importieren root=Tk() ## Wurzelfenster! eingabe = Entry(root) ## Eingabezeile erzeugen eingabe.pack() ## und anzeigen
Ergebnis:
Angenehm: Die Eigenschaften des Textfensters gelten -mit einer wichtigen Ausnahme-
auch für die Eingabezeile. Die Ausnahme betrifft die Höhe (height), diese Eigenschaft macht bei Eingabezeilen keinen Sinn, da ja nur eine Zeile hinein passt . . .
Beispiel (zu den Eigenschaften):
Und so haben wir's gemacht:
eingabe = Entry(root,background='yellow',foreground='blue',font='courier',width=60)
Die drei wichtigsten Methoden des Entry-Widgets sind delete,
get und insert:
insert(END,'jetzt einfuegen'): die Zeichenkette 'jetzt einfuegen' wird in die Eingabezeile geschrieben. Mit Umlauten wird's schwieriger, hierzu müssen wir Unicode (?!?) benutzen, Beispiel:eingabe.insert(END,u'jetzt einf\xfcgen')\xfc steht für ein ü (wie in HTML das ü), hierzu eine Mini-Tabelle:
| Zeichen | in Unicode |
|---|---|
| ä | \xe4 |
| ö | \xf6 |
| ü | \xfc |
| Ä | \xc4 |
| Ö | \xd6 |
| Ü | \xdc |
| ß | \xdf |
| € | \u20ac |
u'jetzt einf\xfcgen'. get(): liefert den Inhalt der Eingabezeile als String zurück.
delete(5): löscht das Zeichen an der 6. Stelle (Tkinter beginnt bei 0 zu zählen!) bzw. delete(5,END): löscht alles ab der 6. Stelle bis zum ENDe.
Beispiel-Sitzung (zu entry_02.py):
>>> eingabe.insert(END,'jetzt einfuegen') >>> eingabe.get() 'jetzt einfuegen' >>> eingabe.delete(5) ## Wirkung: 'jetzteinfuegen' >>> eingabe.delete(5,END) ## Wirkung: 'jetzt'<<<
In den Beispielen hier fehlt der mainloop-Befehl: mainloop startet eine Endlosschleife (!), in der der Python-Interpreter auf Ereignisse wie Maus-Klicks, Maus-Bewegungen oder einem Tastendruck wie zum Beispiel der Enter-Taste wartet. Beendet wird die Endlosschleife, indem das root-Fenster geschlossen & zerstört wird! In Tkinter: root.destroy(). Da wir hier aber noch unsere Tkinter-Anwendung, also das Textfenster oder die Eingabezeile in IDLE verändern wollen, fehlt der mainloop-Befehl. Hierin unterscheiden sich auch die Python-Skripte:
In den Beispiel-Programmen mit der Endung *.pyw steht am Ende jeweils der Befehl:
root.mainloop
Dies sind lauffähige Tkinter-Anwendungen, die man durch Anklicken starten kann. Dagegen fehlt in den Beispiel-Programmen für IDLE
mit der Endung *.py am Ende jeweils der mainloop-Befehl: Diese Python-Skripte kann man nur in IDLE öffnen und dann mit
F5 = Run Module
starten. Dafür kann man in diesen Skripten in IDLE selbst noch Veränderungen vornehmen und testen, so wie wir das oben gemacht haben.
Fazit: willst du ein lauffähiges Tkinter-Skript programmieren, so musst du am Ende den Befehl mainloop aufrufen, weil sonst die Ereignisbehandlungsschleife nicht startet. Diese Skripte solltest du unter der
Endung *.pyw abspeichern, w für Window!
text_03.py in IDLE aus!
arial, courier, times, helvetica oder ansi)!
Teste auch font='times 30', was bewirkt die Zahlenangabe?
text_03.py). Überprüfe das mittels fetter oder kursiver Schrift! Versuche mit fetter oder kursiver Schrift gehen so: font='times bold',
font='arial italic' oder font='courier underline'.
from Tkinter import *