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
Dwa kształty o tej samej szerokości: po lewej Entry wąskie, po prawej rozciągnięte do pełnej szerokości
Ta sama szerokość okna (340px) – tylko columnconfigure(weight=1 różnica) oraz sticky=„ew”
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

stickyEfekt
"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
Otwórz praktykę →