Rozdział 16 · Tworzenie fajnych aplikacji z Tkinter
Adaptacyjne grid: sticky i weight
Mundur nie musi pozostawać w tym samym rozmiarze na zawsze – grid wie, jak go dostosować.
Adaptive grid: Kto dostaje dodatkowe miejsce
Domyślne wiersze i kolumny grid() nie rosną przy powiększaniu
okna. Aby formularz dopasowywał się do rozmiaru okna, kolumnom/łańcuch znaków należy jawnie przydzielić
waga:
adaptivny_grid.py
root.columnconfigure(1, weight=1) # to kolumna 1 (z polami wejściowymi) jest rozciągana
root.rowconfigure(0, weight=1)
ttk.Label(root, text=„Imię:”).grid(row=0, column=0, sticky="w")
ttk.Entry(root).grid(row=0, column=1, sticky="ew") # rozciąga się na całą szerokość komórki
raspredelenie_vesa.py
def raspredelit_prostranstvo(weights, extra_space):
total = sum(weights)
if total == 0:
return [0] * len(weights)
return [extra_space * w / total for w in weights]
print(raspredelit_prostranstvo([1, 2], 300)) # [100.0, 200.0]
weight to współczynnik obrazu, a nie piksele
Waga określa część dodatkowej przestrzeni, a nie rozmiaru absolutnego. Kolumna o wadze 2 otrzyma dwa razy więcej miejsca niż kolumna o wadze 1 — ale obie nadal będą mieszczać swoją zwykłą minimalną zawartość.
sticky — do którego brzegu komórki przykleja się widżet
| sticky | Efekt |
|---|---|
| "w" / "e" / "n" / "s" | przylega do jednej krawędzi komórki (zachód/wschód/północ/południe) |
| "ew" | rozciąga się na szerokość komórki |
| "nsew" | rozciąga się na całą komórkę — zarówno na szerokość, jak i na wysokość |
Zasada jednego rodzica
✓ Właściwie
root (pack)
frame (grid w środku)
label
entry
✗ Błąd
root
widget_a (.pack())
widget_b (.grid())
Mix pack() oraz grid() nie możesz
widgety z to samo nadrzędny – ale inne pojemniki (root
Zastosowania pack(), a zagnieżdżony Frame
w środku — grid()) są całkowicie niezależne od siebie.
place() - Precyzyjne pozycjonowanie
place.py
label.place(x=20, y=10)
label2.place(relx=0.5, rely=0.5, anchor="center") # środkowy pojemnik
place() nie jest pierwszym wyborem dla tradycyjnych form
place() jest przydatny do precyzyjnych nakładek i specjalnych okazji, ale nie dostosowuje się automatycznie do rozmiaru okna jak grid() z łuskami. Dla konwencjonalnych form adaptacyjnych, grid().Jak wybrać menedżera geometrii
pack vs grid vs place
Łatwy układ/regiony pionowe
→
pack()
Formularz/tabela/adaptacyjne kolumny
→
grid()
Precyzyjne lub specjalne pozycjonowanie, nakładki
→
place() — świadomie
Złożona przegroda
→
Frame + różni menedżerowie u różnych rodziców
Praktyka: rozkład wagi w adaptacyjnym grid
Sprawdza się bez tkinter — czysta arytmetyka rozdzielania przestrzeni