Python tkinter | Python-Kurs | Kontrollelemente |
Weiterführende Themen Das Layout ist die Kunst, Kontrollemente in den Fenstern so anzuordnen, dass der Benutzer sich darin zurecht findet. tkinter bietet dazu mehrere Mechanismen an. Mit pack() wird einfach zusammengepackt und mit dem Grid werden die Elemente gitterartig angeordnet. Sie können Ihre Kontrollelemente auch per Pixeladresse komplett selbst platzieren.
Pack
Im ersten Beispiel haben wir die Elemente mit der Funktion pack() einfach in das Fenster hineingepackt. Bei so einfachen Beispielen funktioniert das auch ohne weitere Parameter schon recht gut. Die Funktion erlaubt aber einige Parameter. Da es so viele davon gibt, drängt sich ein Zugriff über den Namen des Parameters geradezu auf.- pack(fill="x") oder pack(fill=tk.X)
Füllt den Bereich in X-Richtung. - pack(padx=5, pady=7)
Umrandet das Element mit 5 Pixeln in X- und 7 Pixeln in Y-Richtung. - pack(ipadx=2, ipady=3) Im inneren wird ein Rahmen gemacht.
- pack(side=tk.LEFT)
Horizontale Ausrichtung, von links nach rechts. - pack(anchor=tk.E)
Horizontale Ausrichtung, von links nach rechts.
Beispiel Eingabemaske
Allein mit pack lässt sich eine Eingabemaske für eine Adresse programmieren, die nicht nur sauber ausgerichtet ist, sondern auch dafür sorgt, dass die Eingabefelder breiter werden, wenn das Fenster vergrößert wird, wie an diesem Screenshot zu sehen.
Das folgende Listing arbeitet mit einem unsichtbaren Rahmen um die Gesamtmaske (rahmenMaske) herum. Dieser ist ein Kind von fenster. Wichtig ist, dass beim pack die Parameter für die Erweiterung der Kindfenster (expand=True) und das Füllen des verbleibenden Platzes in waagerechter Richtung (fill=tk.X) angegeben werden.
Die Spalten werden hintereinander links ausgerichtet (side=tk.LEFT). Die Spalte für die Eingaben (spalteEntry) erhält wiederum die Attribute zum Füllen (fill=tk.X) und zum Erweitern der Kindfenster (expand=True).
Die Eingabefelder selbst benötigen nur noch die Option zum Befüllen des waagerechten Raums (fill=tk.X).
Das Attribut anchor sorgt bei den Labeln dafür, dass der Text nicht mittig sondern nach links (W für West) bzw beim Button nach rechts (E für East) ausgerichtet werden.
#!/usr/bin/python3 import sys import tkinter as tk def ende(): # Callback für den OK-Button sys.exit(0) # verlasse das Programm fenster = tk.Tk() # erstelle ein Hauptfenster # Baue einen Rahmen für die Eingabemaske ein rahmenMaske = tk.Frame(fenster) rahmenMaske.pack(expand=True, fill=tk.X) # Definiere in der Eingabemaske eine Spalte für Label und eine für Eingabe spalteLabel = tk.Frame(rahmenMaske) spalteLabel.pack(side=tk.LEFT) spalteEntry = tk.Frame(rahmenMaske) spalteEntry.pack(side=tk.LEFT, expand=True, fill=tk.X) # Beschriftung und Eingabe für den Namen nameLbl = tk.Label(spalteLabel, text = "Name: ") nameLbl.pack(anchor=tk.W) nameEntry = tk.Entry(spalteEntry) nameEntry.pack(fill=tk.X) # Beschriftung und Eingabe für die Strasse strasseLbl = tk.Label(spalteLabel, text = "Straße Nr: ") strasseLbl.pack(anchor=tk.W) strasseEntry = tk.Entry(spalteEntry) strasseEntry.pack(fill=tk.X) # Beschriftung und Eingabe für den Ort ortLbl = tk.Label(spalteLabel, text = "PLZ und Ort: ") ortLbl.pack() ortEntry = tk.Entry(spalteEntry) ortEntry.pack(fill=tk.X) # Der OK-Button klebt sich als Kind von fenster unter die Maske okBtn = tk.Button(fenster, text = "Ok", command=ende) okBtn.pack(anchor=tk.E) # rechts ausrichten fenster.mainloop()
Grid
In einem Grid können gleichmäßig ausgerichtete Kontrollelemente wie Eingabemasken sehr einfach angelegt werden. Es besteht aus Spalten (column) und Zeilen (row). Diese sind durchnummeriert und wie Sie vermutlich bereits ahnen, beginnt auch hier die Zählung bei 0.Ein Kontrollelement wird in dem Grid positioniert, indem die Memberfunktion grid aufgerufen wird und die Position als Parameter übergeben wird.
Knopf.grid(row=0, column=3) Anzeige.grid(row=2, column=3)Wenn row oder column auf 0 gesetzt sind, können sie auch weggelassen werden.
Place
Dieses Layout platziert ein Widgets in Pixelpositionen auf das Elternfenster.place(x=10, y=20, width=50, height=24)Vorher kann die Geometrie gesetzt werden, um die Größe des Fensters auf die Platzierungen abzustimmen.
root = tk.Tk() # width x height + x_offset + y_offset: root.geometry("170x200+30+30")