Python GUI tkinter Layout
Willemers Informatik-Ecke
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. Damit auch komplexere Strukturen möglich sind, werden Frames eingesetzt. Diese sind unsichtbare Rahmen, die andere Kontrollelemente aufnehmen kann. Jeder Frame kann sein eigenes Layout haben und wiederum eigene Frames aufnehmen.

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

Links