# Tkinter

Tkinter ist eine Sprachanbindung für das GUI-Toolkit Tk für die Programmiersprache Python. Der Name steht als Abkürzung für Tk interface. Tkinter war das erste GUI-Toolkit für Python, weshalb es inzwischen auf Mac OS und Windows auch zum Lieferumfang von Python gehört.

## Funktionsumfang

Durch Tkinter ist es mit Python möglich, Programme mit einer grafischen Benutzeroberfläche zu erstellen. Diese Programme und GUIs können unter Windows, Mac OS und unter allen gängigen Linux-Distributionen genutzt werden.
Inzwischen gibt es mehrere Alternativen, zu denen unter anderem WxPython, PyQt und PySide, PyGTK, Kivy sowie PyFLTK zählen.

## Hallo Welt

Ein einfaches Hallo-Welt-Programm in Python 3.9 mit Tkinter:

## Bedienelemente und Layout-Manager

Tkinter ermöglicht es, verschiedene Bedienelemente im Fenster einzubinden. Dazu zählen z. B. Schaltflächen (Buttons), Schieberegler und Labels. Diese können durch drei unterschiedliche Methoden mithilfe der Layout-Manager in das Fenster integriert werden, zum einen mit dem .pack-Befehl, dem .grid-Befehl und zum anderen mit dem .place-Befehl.

### Grid-Manager

Der Grid-Manager ermöglicht es, Bedienelemente in einer Art Tabelle in das Fenster zu integrieren, das heißt, er basiert im Wesentlichen auf einer Tabelle, die in Reihen und Spalten angeordnet ist. Zur Anordnung werden 'row' und 'column' angegeben, d. h. Zeile und Spalte.
Beispiel für eine Anordnung mithilfe des Grid-Managers:

### Pack-Manager

Der Pack-Manager ist (für den Entwickler) der einfachste Layout-Manager, den Python mitliefert. Statt dem Programm genaue Angaben darüber zu geben, wo man das jeweilige Bedienelement platzieren möchte, muss man lediglich den .pack-Befehl nutzen. Python ordnet das Element anschließend von alleine an und bindet es in das Programm ein.
Beispiel für eine Anordnung mithilfe des Pack-Managers:

### Place-Manager

Der Place Manager hingegen erlaubt eine sehr präzise Angabe der Position. Dabei werden Angaben über die x- und die y-Position der Bedienelemente gemacht. Zu beachten ist hierbei, dass die positive y-Richtung nach unten geht.
Beispiel für Anordnung mithilfe des Place-Managers:

## Widgets
### Label-Widget

Das Label-Widget wird verwendet, um Text im Fenster anzuzeigen.
Hierbei hat das Label-Widget viele Attribute:
| Attribut | Beschreibung | Beispiel |
| text textvarible | Der Text, der im Label angezeigt wird. | text="Hello, World!" textvariable=tk_text_var |
| bg | Die Hintergrundfarbe des Labels. | bg="blue" |
| fg | Die Vordergrundfarbe des Texts im Label. | fg="white" |
| font | Die Schriftart und Größe des Texts im Label. | font=("Helvetica", 16) |
| width | Die Breite des Labels in Zeichen oder Pixel. | width=20 |
| height | Die Höhe des Labels in Zeilen oder Pixel. | height=2 |
| wraplength | Die maximale Breite des Textumbruchs in Pixel. | wraplength=200 |
| anchor | Die Ausrichtung des Texts innerhalb des Labels. | anchor="w" |
| justify | Die Ausrichtung des Texts im Label. | justify="left" |
| relief | Der Rahmenstil des Labels. | relief="solid" |
| bd | Die Breite des Rahmens um das Label. | bd=2 |
| padx, pady | Der zusätzliche horizontale und vertikale Abstand um den Text im Label. | padx=10, pady=5 |
| image | Ein Bild, das im Label angezeigt werden soll. | image=my_image |
| compound | Bestimmt, wie Text und Bild im Label angeordnet werden soll. | compound="left" |
| bitmap | Ein Bitmap-Name, der im Label angezeigt werden soll. | bitmap="info" |
| underline | Die Position des unterstrichenen Buchstabens im Text. | text="Underline", underline=0 |
| cursor | Der Cursor, der angezeigt wird, wenn die Maus über das Label bewegt wird. | cursor="hand2" |
| state | Der Status des Labels: normal, disabled oder active. | state="disabled" |

### Button-Widget

Das Button-Widget wird verwendet, um einen Knopf zu erstellen und diesen verwenden zu können.
Hierbei hat das Button-Widget viele Attribute:
| Attribut | Beschreibung | Beispiel |
| text | Der Text, der im Widget angezeigt werden soll. | text="Schließen" |
| font | Die Schriftart des Textes. | font=("Helvetica", 12) |
| bg | Die Hintergrundfarbe des Widgets. | bg="blue" |
| fg | Die Vordergrundfarbe (Textfarbe) des Widgets. | fg="white" |
| width | Die Breite des Widgets in Zeichen. | width=20 |
| height | Die Höhe des Widgets in Zeilen. | height=2 |
| relief | Der Relief-Stil des Widgets (z. B. "flat", "raised", "sunken", "ridge", "groove"). | relief="raised" |
| justify | Die Ausrichtung des Textes im Widget ("left", "right", "center"). | justify="center" |
| anchor | Die Position des Textes innerhalb des Widgets ("n", "s", "e", "w", "center"). | anchor="center" |
| padx | Der Abstand des Textes zum linken und rechten Rand des Widgets. | padx=10 |
| pady | Der Abstand des Textes zum oberen und unteren Rand des Widgets. | pady=5 |
| image | Ein Bild, das anstelle von Text im Widget angezeigt werden soll. | image=my_image |
| command | Eine Funktion, die ausgeführt wird, wenn das Widget angeklickt wird (nur Button-Widget). | command=button_clicked |

### Entry-Widget

Das Entry-Widget ist ein Eingabefeld, in dem der Nutzer Eintragungen vornehmen kann.
Hierbei hat das Entry-Widget viele Attribute:
| Attribut | Beschreibung | Beispiel |
| font | Die Schriftart und -größe des Textes im Entry. | font=("Helvetica", 12) |
| bg | Die Hintergrundfarbe des Entry. | bg="lightgray" |
| fg | Die Textfarbe des Entry. | fg="black" |
| width | Die Breite des Entry in Zeichen. | width=20 |
| relief | Der Relief-Stil des Entry. | relief="sunken" |
| justify | Die Ausrichtung des Textes im Entry. | justify="center" |

### Text-Widget

Das Text-Widget ist ein großes Eingabefeld.
Hierbei hat das Text-Widget viele Attribute:
| Attribut | Beschreibung | Beispiel |
| font | Die Schriftart und -größe des Textes im Text-Widget. | font=("Helvetica", 12) |
| bg | Die Hintergrundfarbe des Text-Widgets. | bg="white" |
| fg | Die Textfarbe des Text-Widgets. | fg="black" |
| relief | Der Relief-Stil des Text-Widgets. | relief="sunken" |
| width | Die Breite des Text-Widgets in Zeichen. | width=40 |
| height | Die Höhe des Text-Widgets in Zeilen. | height=10 |
| wrap | Der Umbruchmodus des Textes ("none", "char", "word"). | wrap="word" |
| padx | Der Abstand des Textes zum linken und rechten Rand des Widgets. | padx=5 |
| pady | Der Abstand des Textes zum oberen und unteren Rand des Widgets. | pady=5 |
| selectbackground | Die Hintergrundfarbe des ausgewählten Textes im Text-Widget. | selectbackground="blue" |
| selectforeground | Die Textfarbe des ausgewählten Textes im Text-Widget. | selectforeground="white" |
| insertbackground | Die Farbe des Cursors im Text-Widget. | insertbackground="red" |
| insertwidth | Die Breite des Cursors im Text-Widget. | insertwidth=2 |
| insertofftime | Die Zeit in Millisekunden, die der Cursor im Text-Widget sichtbar bleibt, wenn er blinkt. | insertofftime=300 |
| state | Der Zustand des Text-Widgets ("normal", "disabled"). | state="normal" |
| undo | Ein boolescher Wert, der angibt, ob das Rückgängig-Feature aktiviert ist. | undo=True |
| maxundo | Die maximale Anzahl von Schritten, die im Rückgängig-Verlauf gespeichert werden sollen. | maxundo=100 |
| autoseparators | Ein boolescher Wert, der angibt, ob automatisch Trennzeichen zwischen Textblöcken eingefügt werden sollen. | autoseparators=True |
| inactiveselectbackground | Die Hintergrundfarbe des ausgewählten Textes im Text-Widget, wenn es inaktiv ist. | inactiveselectbackground="lightgray" |
| inactiveselectforeground | Die Textfarbe des ausgewählten Textes im Text-Widget, wenn es inaktiv ist. | inactiveselectforeground="black" |
| exportselection | Ein boolescher Wert, der angibt, ob der ausgewählte Text des Text-Widgets auch außerhalb des Widgets verfügbar ist. | exportselection=True |
| insertborderwidth | Die Breite des Rahmens um den Cursor im Text-Widget. | insertborderwidth=1 |
| insertontime | Die Zeit in Millisekunden, die der Cursor im Text-Widget sichtbar bleibt, bevor er blinkt. | insertontime=600 |
| command | Eine Funktion, die ausgeführt wird, wenn der Inhalt des Text-Widgets geändert wird. | command=text_changed |

## Themed Tk (ttk)

Das Modul "Themed Tk" (kurz: ttk) ist ein Modul in Tkinter, welches eine Sammlung von moderner aussehenden Widgets mit erweiterter Funktionalität beinhaltet. Außerdem besitzt ttk mehr Widgets.

### Hello World Programm

Dies ist ein einfaches Hallo-Welt-Programm mit ttk:
Der Unterschied zu normalem Tkinter in diesem Programm ist, dass das Drücken des Knopfes eine andere Animation auslöst.

### Widgets

Ttk besitzt folgende Widgets:
| Widget | Beschreibung |
| ttk.Button | Ein Button-Widget mit modernem Look. |
| ttk.Label | Ein Label-Widget mit modernem Look. |
| ttk.Entry | Ein Eingabefeld für die Texteingabe mit modernem Look. |
| ttk.Combobox | Ein Kombinationsfeld (Dropdown-Menü) mit modernem Look. |
| ttk.Treeview | Ein Widget zur Anzeige hierarchischer Daten, ähnlich einer Baumstruktur. |
| ttk.Notebook | Ein Tab-Widget zur Darstellung von Registerkarten. |
| ttk.Progressbar | Ein Fortschrittsbalken zur Anzeige des Fortschritts eines Prozesses. |
| ttk.Checkbutton | Ein Kontrollkästchen mit modernem Look. |
| ttk.Radiobutton | Ein Optionsbutton mit modernem Look. |
| ttk.Scale | Ein Schieberegler mit modernem Look. |
| ttk.Separator | Ein Trennlinien-Widget mit modernem Look. |