2009-09-28 7 views
7

Próbuję napisać podstawowy GUI Tkinter, który ma widżet Text u góry, a następnie widget Button wyrównany pod nim, a następnie kolejny widget Text pod przyciskiem. Problem polegający na tym, że po zapakowaniu widżetu Button po lewej stronie, kiedy następnie pakuję drugi widżet Text, umieszcza go obok przycisku po prawej, zamiast pod przyciskiem. Dzieje się tak niezależnie od tego, co mam ustawić side argument za drugi Text widget Oto prosty kawałek kodu, który pokazuje to zachowanie:Jak spakować widżet tkintera pod istniejącym widgetem, który został spakowany po lewej stronie?

from Tkinter import * 

root = Tk() 

w = Text(root) 
w.pack() 

x = Button(root, text="Hi there!") 
x.pack(side=LEFT) 

y = Text(root) 
y.pack(side=BOTTOM) 

root.mainloop() 

Więc jak pójdę o utworzenie drugiego Text widżet tak, że wydaje się, poniżej przycisku, a nie po jego prawej stronie?

+0

Pomocny może być argument "before" słowa kluczowego metody 'pack()'. –

Odpowiedz

13

Istnieją zasadniczo dwa rozwiązania problemów układ:

  1. przełącznik do korzystania z sieci. Tworzenie układów, takich jak to, co próbujesz osiągnąć, jest naprawdę łatwe. Siatka może rozwiązać prawdopodobnie 95% wszystkich problemów z układem (to niesamowite, kiedy o tym myślisz - Tk robi z jednym menedżerem, czego większość zestawów narzędzi potrzebuje pół tuzina do wykonania!)

  2. użyć wielu ramek. Jeśli niektóre widżety muszą być ułożone od góry do dołu, a niektóre od lewej do prawej, nie zawsze można uzyskać to, co chcesz, pakując wszystko w jedną ramkę. Użyj jednej ramki dla górnych i dolnych części układu i dodatkowych ramek dla treści od lewej do prawej.

Zdaj sobie również sprawę, że widżety nie muszą być potomkami widżetu, w którym są spakowane/wypełnione. Możesz użyć parametru "in", aby umieścić widżety w innym pojemniku niż ich rodzic.

Na przykład w konkretnym przykładzie można utworzyć trzy ramki, górną, środkową i dolną. Spakuj je od góry do dołu w oknie głównym. Następnie możesz spakować pierwszy widget tekstowy u góry, przycisk lub przyciski poziomo w środku, a drugi widget tekstowy u dołu.

Zaletą takiego podejścia jest to, że znacznie ułatwia zmianę układu w przyszłości (co w moim odczuciu jest zawsze ). Nie musisz ponownie rodzić żadnego z twoich widżetów, po prostu spakuj/umieść/umieść je w innym pojemniku.

W swoim krótkim przykładzie nie robi to wielkiej różnicy, ale w przypadku złożonych aplikacji ta strategia może uratować życie.

Moja najlepsza rada jest taka: układ nie jest po myśli. Zrób trochę planowania, może nawet poświęć pięć minut na rysowanie na papierze milimetrowym. Najpierw zdecyduj się na główne regiony swojej aplikacji i użyj ramki lub innego pojemnika dla każdego z nich (okno panoramiczne, notatnik itp.). Gdy już to zrobisz, zastosuj takie samo podejście do dzielenia i zdobywania dla każdej sekcji. Dzięki temu możesz korzystać z różnych typów układów dla różnych sekcji aplikacji. Paski narzędzi mają układ poziomy, formularze mogą mieć układ pionowy itp.

3

Pakowanie odbywa się w kolejności, w której wywoływane są metody .pack, więc gdy x ma "zajęte" lewą stronę, to jest to - zajmie ona lewą część jej rodzica, a wszystko inne w jej rodzicu będzie prawda. Musisz ramkę „pośredniczyć”, np ...:

from Tkinter import * 

root = Tk() 

w = Button(root, text="Mysterious W") 
w.pack() 

f = Frame(root) 
x = Button(f, text="Hi there!") 
x.pack() 

y = Button(f, text="I be Y") 
y.pack(side=BOTTOM) 

f.pack(side=LEFT) 

root.mainloop() 

(zmiana tekstów Przyciski do bardziej bezpośredniej widoczności tylko układ - The Tkinter na tej Mac nie pokazuje wyraźnie, aż Teksty mają ostrość , ale przyciski są całkiem jasne ;-).

7

Początkowo nie rozumiałem, jak działa pakowanie i nie zdawałem sobie sprawy, że cała "lewa strona" została "odebrana", gdy zrobiłem x.pack(side=LEFT). To, co znalazłem po przeczytaniu this i odpowiedź Alex tutaj jest taka, że ​​naprawdę nie miałem po x spakowania na lewą stronę, ale raczej mając po lewej stronie zakotwiczone, używając anchor=W (W na zachód) zamiast side=LEFT . Moja zmieniony fragment kodu, który robi to, co było po wygląda następująco:

from Tkinter import * 

root = Tk() 

w = Text(root) 
w.pack() 

x = Button(root, text="Hi there!") 
x.pack(anchor=W) 

y = Text(root) 
y.pack(side=BOTTOM) 

root.mainloop() 

ten sposób x nie jest „twierdząc,” lewy bok już, to tylko wyrównany do lewej (lub Zachodniej) w swoim bloku przestrzeni.

Powiązane problemy