Tkinter – Klassen

Wenn Sie größere Programme schreiben, ist es normalerweise eine gute Idee, Ihren Code in eine oder mehrere Klassen einzuordnen. Das folgende Beispiel wurde aus dem Programm „Hallo Welt“ in übernommen

Wenn Sie auf die rechte Schaltfläche klicken, wird der Text „Hallo, Zusammen!“ auf die Konsole gedruckt. Wenn Sie auf die linke Schaltfläche klicken, wird das Programm angehalten.

Hinweis: Einige Python-Entwicklungsumgebungen haben Probleme bei der Ausführung von Tkinter-Beispielen wie diesem. Das Problem ist normalerweise, dass die Umgebung Tkinter selbst verwendet, und der Mainloop-Aufruf und die Beendigungsaufrufe interagieren mit den Erwartungen der Umgebung. In anderen Umgebungen kann es zu Fehlverhalten kommen, wenn Sie den expliziten Aufruf zum Löschen weglassen. Wenn sich das Beispiel nicht wie erwartet verhält, suchen Sie nach Tkinter-spezifischer Dokumentation für Ihre Entwicklungsumgebung.

Details
Diese Beispielanwendung wird als Klasse geschrieben. Der Konstruktor (die Methode __init__) wird mit einem übergeordneten Widget (dem Master) aufgerufen, dem er eine Anzahl untergeordneter Widgets hinzufügt. Der Konstruktor beginnt mit der Erstellung eines Frame-Widgets. Ein Frame ist ein einfacher Container und wird in diesem Fall nur für die beiden anderen Widgets verwendet.

class App:     
def __init__(self, master):
frame = Frame(master)
frame.pack()

Die Frame-Instanz wird in einer lokalen Variablen namens Frame gespeichert. Nach dem Erstellen des Widgets rufen wir sofort die Pack-Methode auf, um den Frame sichtbar zu machen.

Wir erstellen dann zwei Button-Widgets, die dem Rahmen untergeordnet sind.

self.button = Button(frame, text="Fenster Schliessen", fg="red", command=frame.quit) 
self.button.pack(side=LEFT) self.hi_there = Button(frame, text="Hallo", command=self.say_hi)
self.hi_there.pack(side=LEFT)

Diesmal übergeben wir dem Konstruktor eine Reihe von Optionen als Schlüsselwortargumente. Die erste Schaltfläche hat die Bezeichnung „Fenster Schliessen“ und ist rot (fg steht für foreground = Vordergrund). Der zweite trägt die Bezeichnung „Hallo“. Beide Tasten haben auch eine Befehlsoption. Diese Option gibt eine Funktion oder (wie in diesem Fall) eine gebundene Methode an, die aufgerufen wird, wenn auf die Schaltfläche geklickt wird.

Die Schaltflächeninstanzen werden in Instanzattributen gespeichert. Sie sind beide gepackt, aber diesmal mit dem Argument side = LEFT. Dies bedeutet, dass sie so weit wie möglich im Rahmen platziert werden. Die erste Schaltfläche befindet sich am linken Rand des Rahmens und der zweite befindet sich direkt rechts vom ersten (dh am linken Rand des verbleibenden Bereichs im Rahmen). Standardmäßig werden Widgets relativ zum übergeordneten Element (das Master für das Frame-Widget und das Frame selbst für die Schaltflächen) gepackt. Wenn die Seite nicht angegeben ist, wird standardmäßig TOP verwendet.

Als nächstes wird der „Hallo“ -Buttonrückruf gegeben. Bei jedem Tastendruck wird einfach eine Meldung an die Konsole ausgegeben:

def say_hi(self):
print ("Hallo Zusammen!")

Schließlich stellen wir Code auf Skriptebene bereit, mit dem ein Tk-Stamm-Widget erstellt wird, und eine Instanz der App-Klasse, die das Stamm-Widget als übergeordnetes Element verwendet:

root = Tk() 
app = App(root)
root.mainloop()
root.destroy()

Der Aufruf mainloop ruft die Tk-Ereignisschleife auf, in der die Anwendung verbleibt, bis die quit-Methode aufgerufen wird (klicken Sie einfach auf die Schaltfläche Fenster Schliessen) oder das Fenster wird geschlossen.

Der destroy-Aufruf ist nur erforderlich, wenn Sie dieses Beispiel in bestimmten Entwicklungsumgebungen ausführen. es zerstört explizit das Hauptfenster, wenn die Ereignisschleife beendet wird. Einige Entwicklungsumgebungen beenden den Python-Prozess nicht, wenn dies nicht der Fall ist.

Weitere Informationen zu Widgetreferenzen

Im zweiten Beispiel wird das Frame-Widget in einer lokalen Variablen namens frame gespeichert, während die Schaltflächen-Widgets in zwei Instanzattributen gespeichert werden. Was passiert, wenn die __init__-Funktion zurückkehrt und die Frame-Variable ihren Gültigkeitsbereich verlässt?

Entspann dich; Es ist nicht nötig, einen Verweis auf die Widget-Instanz zu behalten. Tkinter verwaltet automatisch eine Widget-Struktur (über die Master- und Cind-Attribute jeder Widget-Instanz), sodass ein Widget nicht verschwindet, wenn die letzte Referenz der Anwendung nicht mehr vorhanden ist. Es muss explizit zerstört werden, bevor dies geschieht (mithilfe der destroymethode). Wenn Sie jedoch etwas mit dem Widget machen möchten, nachdem es erstellt wurde, sollten Sie einen Verweis auf die Widget-Instanz selbst behalten.

Wenn Sie keinen Verweis auf ein Widget aufbewahren müssen, ist es möglicherweise verlockend, das Widget in einer einzigen Zeile zu erstellen und zu packen:

Button(frame, text="Hallo", command=self.hallo).pack(side=LEFT)

Speichern Sie das Ergebnis dieser Operation nicht. Sie werden nur enttäuscht, wenn Sie versuchen, diesen Wert zu verwenden (die Pack-Methode gibt None zurück). Um auf der sicheren Seite zu sein, ist es möglicherweise besser, die Konstruktion immer von der Verpackung zu trennen:

w = Button(frame, text="Hallo", command=self.hallo)  w.pack(side=LEFT) 

Mehr zu Widget-Namen

Eine weitere Verwirrung, insbesondere für diejenigen, die Erfahrung mit der Programmierung von Tk mit Tcl haben, ist die Vorstellung von Tkinter über den Namen des Widgets. In Tcl müssen Sie jedes Widget explizit benennen. Der folgende Tcl-Befehl erstellt beispielsweise eine Schaltfläche mit dem Namen „ok“ als untergeordnetes Element für ein Widget mit dem Namen „dialog“ (das wiederum ein untergeordnetes Element des Stammfensters „.“ Ist).

button .dialog.ok 

Der entsprechende Tkinter-Aufruf würde folgendermaßen aussehen:

ok = Button(dialog)

Im Fall von Tkinter sind ok und dialog Verweise auf Widgetinstanzen, nicht die tatsächlichen Namen der Widgets. Da Tk selbst die Namen benötigt, weist Tkinter jedem neuen Widget automatisch einen eindeutigen Namen zu. In dem obigen Fall ist der Name des Dialogs wahrscheinlich „.1428748“ und die Schaltfläche könnte „.1428748.1432920“ heißen. Wenn Sie den vollständigen Namen eines Tkinter-Widgets erhalten möchten, verwenden Sie einfach die str-Funktion der Widget-Instanz:

>>> print str(ok) .1428748.1432920

Wenn Sie etwas ausgeben, verwendet Python automatisch die str-Funktion, um herauszufinden, was ausgegeben werden soll. Aber offensichtlich macht eine Operation wie „name = ok“ das nicht, deshalb sollten Sie unbedingt unbedingt str verwenden, wenn Sie den Namen benötigen.

Wenn Sie wirklich den Namen eines Widgets angeben müssen, können Sie die Namenoption beim Erstellen des Widgets verwenden. Ein (und wahrscheinlich auch der einzige) Grund dafür ist, wenn Sie mit in Tcl geschriebenem Code kommunizieren müssen.

Im folgenden Beispiel heißt das resultierende Widget „.dialog.ok“ (oder, wenn Sie vergessen haben, den Dialog zu benennen, etwa „.1428748.ok“):

ok = Button(dialog, name="ok") 

Verwenden Sie keine Namen, die nur Ziffern enthalten, um Konflikte mit dem Benennungsschema von Tkinter zu vermeiden. Beachten Sie auch, dass der Name eine Option nur für die Erstellung ist. Sie können den Namen nicht mehr ändern, wenn Sie das Widget erstellt haben.

Tkinter-Klassen Widget-Klassen

Tkinter unterstützt 15 Kern-Widgets:

Button
Eine einfache Schaltfläche, mit der ein Befehl oder eine andere Operation ausgeführt wird.

Canvas = Segeltuch
Strukturierte Grafiken. Mit diesem Widget können Sie Diagramme und Plots zeichnen, Grafikeditoren erstellen und benutzerdefinierte Widgets implementieren.

Checkbutton
Stellt eine Variable dar, die zwei verschiedene Werte haben kann. Durch Klicken auf die Schaltfläche wird zwischen den Werten gewechselt.

Entry
Ein Texteingabefeld.

Frame
Ein Container-Widget. Der Frame kann einen Rahmen und einen Hintergrund haben und wird beim Erstellen einer Anwendung oder eines Dialoglayouts zum Gruppieren anderer Widgets verwendet.

Menu
Ein Menübereich. Wird verwendet, um Pulldown- und Popup-Menüs zu implementieren.

Label
Zeigt einen Text oder ein Bild an.

Listbox
Zeigt eine Liste von Alternativen an. Die Listbox kann so konfiguriert werden, dass das Verhalten von Radiobuttons oder Checklisten angezeigt wird.

Menubutton
Ein Menubutton. Wird verwendet, um Pulldown-Menüs zu implementieren.

Message
Einen Text anzeigen Ähnlich wie das Beschriftungs-Widget, kann Text jedoch automatisch auf eine bestimmte Breite oder ein bestimmtes Seitenverhältnis umbrechen.

Radiobutton
Stellt einen Wert einer Variablen dar, der einen von vielen Werten haben kann. Durch Klicken auf die Schaltfläche wird die Variable auf diesen Wert gesetzt und alle anderen mit derselben Variablen verknüpften Radiobuttons gelöscht.

Scale
Ermöglicht das Festlegen eines numerischen Werts durch Ziehen eines Schiebereglers.

Scrollbar
Standard-Bildlaufleisten für die Verwendung mit Zeichenflächen, Einträgen, Listenfeldern und Text-Widgets.

Text
Formatierte Textanzeige. Ermöglicht das Anzeigen und Bearbeiten von Text mit verschiedenen Stilen und Attributen. Unterstützt auch eingebettete Bilder und Fenster.

Toplevel
Ein Container-Widget wird als separates Fenster der obersten Ebene angezeigt.

LabelFrame
Eine Variante des Frame-Widgets, mit der sowohl Rahmen als auch Titel gezeichnet werden können.

PanedWindow
Ein Container-Widget, das untergeordnete Widgets in anpassbaren Bereichen organisiert.

Spinbox
Eine Variante des Entry-Widgets zum Auswählen von Werten aus einem Bereich oder einer geordneten Menge.

Beachten Sie auch, dass es keine Widget-Klassenhierarchie in Tkinter gibt. Alle Widget-Klassen sind gleichgeordnete Elemente im Vererbungsbaum.

Alle diese Widgets bieten die Verwaltungsmethoden Misc und Geometrie, die Konfigurationsverwaltungsmethoden und zusätzliche Methoden, die vom Widget selbst definiert werden. Darüber hinaus stellt die Toplevel-Klasse auch die Fenstermanager-Schnittstelle bereit. Dies bedeutet, dass eine typische Widget-Klasse ungefähr 150 Methoden bereitstellt.

Mixins

Das Tkinter-Modul bietet Klassen, die den verschiedenen Widget-Typen in Tk entsprechen, sowie eine Reihe von Mixin- und anderen Hilfsklassen (ein Mixin ist eine Klasse, die mit anderen Klassen unter Verwendung von Mehrfachvererbung kombiniert werden kann). Wenn Sie Tkinter verwenden, sollten Sie niemals direkt auf die Mixin-Klassen zugreifen.

Implementierungs-Mixins

Die Misc-Klasse wird vom Root-Fenster und den Widgetklassen als Mixin verwendet. Es bietet eine Vielzahl von Tk- und Window-bezogenen Diensten, die somit für alle Tkinter-Kernwidgets verfügbar sind. Dies geschieht durch Delegation. Das Widget leitet die Anfrage einfach an das entsprechende interne Objekt weiter.

Die Wm-Klasse wird vom Root-Fenster und den Toplevel-Widgetklassen als Mixin verwendet. Es bietet Window-Manager-Services, auch per Delegation.

Durch die Verwendung der Delegierung wird der Anwendungscode vereinfacht: Sobald Sie ein Widget haben, können Sie auf alle Teile von Tkinter mithilfe von Methoden in der Widgetinstanz zugreifen.

Geometrie-Mixins

Die Klassen Grid, Pack und Place werden von den Widget-Klassen als Mixins verwendet. Sie bieten Zugriff auf die verschiedenen Geometriemanager, auch über Delegierung.

Die Klassen Grid, Pack und Place werden von den Widget-Klassen als Mixins verwendet. Sie bieten Zugriff auf die verschiedenen Geometriemanager, auch über Delegierung.

Grid = Gitter
    Mit dem Rastergeometrie-Manager können Sie tabellarische Layouts erstellen, indem Sie die Widgets in einem 2-dimensionalen Raster organisieren. Verwenden Sie zur Verwendung dieses Geometriemanagers die Rastermethode.
Pack
    Mit dem Packgeometrie-Manager können Sie ein Layout erstellen, indem Sie die Widgets in ein übergeordnetes Widget „packen“, indem Sie sie als rechteckige Blöcke behandeln, die in einem Rahmen platziert werden. Um diesen Geometriemanager für ein Widget zu verwenden, verwenden Sie die Pack-Methode für dieses Widget, um die Einstellungen vorzunehmen.
Place = Platz
    Mit dem Bereichsgeometriemanager können Sie ein Widget explizit an einer bestimmten Position platzieren. Verwenden Sie die Place-Methode, um diesen Geometriemanager zu verwenden.

Widget-Konfigurationsverwaltung

Die Widget-Klasse mischt die Misc-Klasse mit den Geometriemixins und fügt das Konfigurationsmanagement über die cget- und configure-Methoden sowie über eine teilweise Wörterbuchschnittstelle hinzu. Letzteres kann zum Einstellen und Abfragen einzelner Optionen verwendet werden und wird im nächsten Kapitel näher erläutert.Feedback gebenVerlaufGespeichertCommunity