Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
python:tk [2023/02/28 22:30] root angelegt |
python:tk [2023/03/28 07:58] (aktuell) root [Grid] |
||
---|---|---|---|
Zeile 5: | Zeile 5: | ||
* schnell zu erlennen | * schnell zu erlennen | ||
* weniger Aufwand als die großen Frameworks (GTK, QT usw.) | * weniger Aufwand als die großen Frameworks (GTK, QT usw.) | ||
+ | * war zeitweise als HTML-Rendering-Engine gedacht (angeblich) | ||
Zeile 10: | Zeile 11: | ||
====== Begriffe/ | ====== Begriffe/ | ||
- | ==== Widgets ===== | + | ===== Widgets ===== |
* alle Elemente die man sehen kann | * alle Elemente die man sehen kann | ||
Zeile 20: | Zeile 21: | ||
* das oberste Element ist root | * das oberste Element ist root | ||
* root entsteht beim instanzieren von TK | * root entsteht beim instanzieren von TK | ||
- | | + | |
+ | * es gibt nur ein root, ein root kann aber mehere Toplevel haben (mehere Fenster) | ||
+ | ==== Konfiguration/ | ||
+ | |||
+ | * die Eigenschaften von Widgets werden " | ||
+ | * entweder beim instanzieren als Parameter | ||
+ | * oder über Indexes | ||
+ | |||
+ | <sxh python> | ||
+ | button = ttk.Button() | ||
+ | button[" | ||
+ | </ | ||
+ | |||
+ | oder über die configure-Methode: | ||
+ | |||
+ | <sxh python> | ||
+ | button = ttk.Button() | ||
+ | button.configure(text = " | ||
+ | </ | ||
+ | |||
+ | * Attribute sind also nicht direkt als solche zugänglich | ||
+ | |||
+ | |||
+ | * man kann sich alle Eigenschaften auflisten lassen: | ||
+ | <sxh python> | ||
+ | button.configure() | ||
+ | </ | ||
+ | |||
+ | <sxh python> | ||
+ | {' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | <index object: ' | ||
+ | <index object: ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | </ | ||
+ | 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 " | ||
+ | * 5. der aktuelle Wert -> bei " | ||
+ | |||
+ | |||
+ | ==== Informationen über Widget-Objekte ==== | ||
+ | |||
+ | * winfo liefert für ein Widget-Objekte Informationen | ||
+ | * window ist eine veraltete Bezeichnung für Widget innerhalb Tk | ||
+ | |||
+ | <sxh python> | ||
+ | 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/ | ||
+ | |||
+ | |||
+ | ===== Events ===== | ||
+ | |||
+ | * Ereignisse wie Mausklicks, Tastenanschläge usw. | ||
+ | * oder interne Events wie Timer | ||
+ | |||
+ | ==== Eventloop ==== | ||
+ | |||
+ | <sxh python> | ||
+ | from tkinter import * | ||
+ | root = Tk() | ||
+ | root.mainloop() | ||
+ | </ | ||
+ | |||
+ | * root.mainloop() startet hier die Eventloop | ||
+ | * mainloop ist Teil des root-Elements, | ||
+ | * 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) | ||
- | ===== |