Platzieren der Elemente in der GUI über pack()
versus grid()
Bisher haben wir unsere Elemente einfach über die Methode .pack()
ausgegeben. Dies ist je nach Anwendungsfall sehr aufwendig. Schauen wir uns die Möglichkeiten über .grid()
an. Das englische Wort „grid“ bedeutet nichts anderes wie Gitter. Die zwischenräume des Gitters können sehr einfach angegeben werden über die Reihe („row“) und Spalte („colum“).
Im folgenden Beispiel erzeugen wir 3 Textausgaben mit unterschiedlichen Hintergrundfarben, die wir dann durch das Gitter sehr einfach platzieren können.
import tkinter as tk
root = tk.Tk()
label1 = tk.Label(root, text="Hallo Welt", bg="orange")
label1.grid(row=0, column=0)
label2 = tk.Label(root, text="R1 / C1", bg="lightgreen")
label2.grid(row=1, column=1)
label3 = tk.Label(root, text="R2 / C2", bg="lightblue")
label3.grid(row=2, column=2)
root.mainloop()
Wir sehen hier sehr schön, wie die einzelnen Texte in die entsprechenden Reihen und Spalten platziert werden. Dabei bestimmt der benötigte Platz des Textes die Spaltenbreite.
[bild[Ausgabe von TKinter über grid()]]Haben wir eine weitere Ausgabe in Spalte 0 und Zeile 3, die weniger Platz benötigt, wird diese standardmäßig mittig ausgerichtet:
[bild[Ausgabe in GUI standardmäßig mittig]]Über die Anweisung print(dir(tk.Grid))
erhalten wir alle Informationen über die Möglichkeiten von Grid
.
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'bbox', 'columnconfigure', 'config', 'configure', 'forget', 'grid', 'grid_bbox', 'grid_columnconfigure', 'grid_configure', 'grid_forget', 'grid_info', 'grid_location', 'grid_propagate', 'grid_remove', 'grid_rowconfigure', 'grid_size', 'grid_slaves', 'info', 'location', 'propagate', 'rowconfigure', 'size', 'slaves']
Und die Attribute für unser grid(…)
über print(help(tk.Grid.grid))
:
Wir können also folgende Attribute mitgeben:
grid_configure(self, cnf={}, **kw)
Position a widget in the parent widget in a grid. Use as options:
column=number - use cell identified with given column (starting with 0)
columnspan=number - this widget will span several columns
in=master - use master to contain this widget
in_=master - see 'in' option description
ipadx=amount - add internal padding in x direction
ipady=amount - add internal padding in y direction
padx=amount - add padding in x direction
pady=amount - add padding in y direction
row=number - use cell identified with given row (starting with 0)
rowspan=number - this widget will span several rows
sticky=NSEW - if cell is larger on which sides will this
widget stick to the cell boundary
Über das Attribut sticky=
können wir unseren Inhalt an einer Seite ausrichten und sind nicht auf die zentrierte Ausgabe festgelegt. Als Attributwert diesen die Himmelsrichtungen wir „n, s, w, e, sw, se, ..“
import tkinter as tk
root = tk.Tk()
label1 = tk.Label(root, text="Hallo Welt", bg="orange")
label1.grid(row=0, column=0)
label2 = tk.Label(root, text="R1 / C1", bg="lightgreen")
label2.grid(row=1, column=1)
label3 = tk.Label(root, text="R2 / C2", bg="lightblue")
label3.grid(row=2, column=2)
label4 = tk.Label(root, text="R2/C0", bg="yellow")
label4.grid(row=2, column=0, sticky='e')
root.mainloop()
Unser gelber Inhalt (R2/C0) ist jetzt rechts ausgerichtet – sprich im Osten (englisch east = „e“)
[bild[Inhalt in den Zellen ausrichten, z.B. rechtsbündig]]