* 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)