Benutzer-Werkzeuge

Webseiten-Werkzeuge


python:tk
  • 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',
  <index object: 'normal'>,
  <index object: 'normal'>),
 '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_classKlasse des Widget-Objektes
winfo_childrenListe von Kind-Objekten (also direkten Kindern).
Zum Beispiel um alle Objekte innerhalb eines Fensters (root oder TopLevel) oder Frames zu enthalten
winfo_parentDas Eltern-Widget des Widgets
winfo_toplevelToplevel-Fenster zu dem das Widget gehört
windfo_widthDerzeitige Breite des Elements (wenn es auf dem Bildschirm angezeigt wird)
windfo_heightDerzeitige Höhe des Elements (wenn es auf dem Bildschirm angezeigt wird)
winfo_reqwidthDie Breite die das Widget vom Geometrie-Manager angefordert hat
winfo_reqheightDie Höhe die das Widget vom Geometrie-Manager angefordert hat
winfo_xX-Position des Widgets innerhalb des Eltern-Widgets
winfo_yY-Position des Widgets innerhalb des Eltern-Widgets
winfo_rootxX-Position betrachtet auf den gesamten Bildschirm
winfo_rootyY-Position betrachtet auf den gesamten Bildschirm
winfo_vieweableOb 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)
python/tk.txt · Zuletzt geändert: 2023/03/28 07:58 von root