* TK = Oberflächen-Bibliothek von TCL (Scriptsprache)
* hat Bindings zu verschiedenen anderen Sprachen
* TKinter ist die für Python
* technisch setzen alle Aufrufe TCL-Befehle ab die dann die GUI "malen"
* schnell zu erlennen
* weniger Aufwand als die großen Frameworks (GTK, QT usw.)
* war zeitweise als HTML-Rendering-Engine gedacht (angeblich)
====== Begriffe/Konzept ======
===== Widgets =====
* alle Elemente die man sehen kann
* also Eingabefelder, Panels, Labels usw.
* manchmal auch Controls genannt
* jedes Widget wird durch ein eigenes Objekt dargestellt
* alle Widgets haben ein Eltern-Element innerhalb dessen sie ggf. platziert sind
* das ist der erste Parameter beim instanzieren
* das oberste Element ist root
* root entsteht beim instanzieren von TK
* das trifft auch auf Fenster (sogenannte Toplevel) zu
* es gibt nur ein root, ein root kann aber mehere Toplevel haben (mehere Fenster)
==== Konfiguration/Konfigurationsoptionen ====
* die Eigenschaften von Widgets werden "indirekt" gesetzt (nicht über Objekt-Attribute)
* entweder beim instanzieren als Parameter
* oder über Indexes
button = ttk.Button()
button["text"] = "SomeText"
oder über die configure-Methode:
button = ttk.Button()
button.configure(text = "SomeText")
* Attribute sind also nicht direkt als solche zugänglich
* man kann sich alle Eigenschaften auflisten lassen:
button.configure()
{'command': ('command', 'command', 'Command', '', ''),
'default': ('default',
'default',
'Default',
,
),
'takefocus': ('takefocus',
'takeFocus',
'TakeFocus',
'ttk::takefocus',
'ttk::takefocus'),
'text': ('text', 'text', 'Text', '', 'Bla'),
Ausgabe ist abgeschnitten…
* 1. Parameter ist der Parametername
* 2. Parameter Object-Name in der Options-Datenbank (in der Regel unrelevant)
* 3. Parameter Objekt-Klasse in der Options-Datenbank (in der Regel unrelevant)
* 4. Parameter Default-Wert -> bei "text" "" -> leer
* 5. der aktuelle Wert -> bei "text" 'Bla'
==== Informationen über Widget-Objekte ====
* winfo liefert für ein Widget-Objekte Informationen
* window ist eine veraltete Bezeichnung für Widget innerhalb Tk
button.vieweable()
^Methode ^Beschreibung ^
|winfo_class|Klasse des Widget-Objektes|
|winfo_children|Liste von Kind-Objekten (also direkten Kindern). \\ Zum Beispiel um alle Objekte innerhalb eines Fensters (root oder TopLevel) oder Frames zu enthalten|
|winfo_parent|Das Eltern-Widget des Widgets|
|winfo_toplevel|Toplevel-Fenster zu dem das Widget gehört|
|windfo_width|Derzeitige Breite des Elements (wenn es auf dem Bildschirm angezeigt wird)|
|windfo_height|Derzeitige Höhe des Elements (wenn es auf dem Bildschirm angezeigt wird)|
|winfo_reqwidth|Die Breite die das Widget vom Geometrie-Manager angefordert hat|
|winfo_reqheight|Die Höhe die das Widget vom Geometrie-Manager angefordert hat|
|winfo_x|X-Position des Widgets innerhalb des Eltern-Widgets|
|winfo_y|Y-Position des Widgets innerhalb des Eltern-Widgets|
|winfo_rootx|X-Position betrachtet auf den gesamten Bildschirm|
|winfo_rooty|Y-Position betrachtet auf den gesamten Bildschirm|
|winfo_vieweable|Ob das Widget derzeit angezeigt wird oder versteckt ist|
===== Geometry-Manager =====
* managed die Platzierung der Widgets im Fenster
* definiert wie mit leerem Platz umgegangen wird
* wie mit Größenänderung des Fensters umgegangen wird
* Neuplatzierung der Widgets
* verkleinern der Widgets usw.
* es gibt mehrere
* der derzeit üblicherweise genutzte ist grid
* früher wurde pack verwendet
* erst durch Aufrufen des Geometry-Managers für ein Widget wird es platziert und sichtbar
* verschiedene Elemente können einen Geometry-Manager haben
* zum Beispiel root und innerhalb dessen ein Frame
* der Geometry-Manager des Frame-Elements managed nur die Elemente innerhalb des Frames
* und nur den Platz den das Frame-Element hat
* Elemente die andere enthalten werden Master genannt und die enthaltenen Elemente Slave
* ein Master kann (wenn es nicht root ist) gleichzeitig auch Slave sein
* da es in einem anderen Element enthalten ist und selbst Elemente enthält
==== Grid ====
* verhält sich ähnlich einer HTML-Tabelle
* so ähnlich wie man früher per HTML-Tabellen Layouts erstellt hat
* es gibt eine Tabelle mit Spalten und Zeilen
* ein Element wird jeweils einer Spalte und Zelle zugeordnet
* ein Element kann allerdings über mehrere Spalten und Zellen gehen (wenn das explizit angegeben wird)
* die Tabelle nimmt per Default nur so viel Platz ein wie benötigt wird
* Elemente verteilen sich also nicht unbedingt gleichmäßig über den gesamten Fensterplatz
* Spalten und Zeilen sind nur so groß wie die Elemente und deren Ausrichtung verlangt
* sie beginnen links (Spalten) und oben (Zeilen)
* leere Zeilen haben keine Größe
* es kann optional definiert werden das bestimmte Zeilen/Spalten Priorität über andere haben sollen und das sie den gesamten zur Verügung stehenden Platz füllen sollen
===== Events =====
* Ereignisse wie Mausklicks, Tastenanschläge usw.
* oder interne Events wie Timer
==== Eventloop ====
from tkinter import *
root = Tk()
root.mainloop()
* root.mainloop() startet hier die Eventloop
* mainloop ist Teil des root-Elements, welches durch instanzieren von Tk entsteht
* Mainloop fragt bei jedem Durchlauf alle Objekte ab ob für sie ein Ereignis vorliegt
* Mainloop läuft bis alle Fenster geschlossen wurden
* Mainloop sollte nicht blockiert werden (keine länger dauernden Aufgaben als Teil von ihr ausgeführt werden)
* führt zu fehlenden Reaktionen auf Benutzerereignisse
* führt zu fehlenden Re-Draws (neuzeichnen der Elemente wenn sich etwas ändert oder Fenster gewechselt wurden)