Ich versuche, eine grundlegende Tkinter-GUI zu schreiben, die oben ein Text
-Widget hat, dann ein Button
-Widget linksbündig, dann ein weiteres Text
-Widget unterhalb der Schaltfläche. Das Problem, das ich habe, ist, nachdem ich das Button
Widget nach links gepackt habe, wenn ich dann das zweite Text
Widget einpacke, es neben dem Button rechts neben dem Button platziere. Das passiert unabhängig davon, was ich für das zweite side
Widget auf das Text
Argument gesetzt habe. Hier ist ein einfaches Stück Code, das dieses Verhalten demonstriert:
Wie würde ich also das zweite Widget Text
so einrichten, dass es unterhalb der Schaltfläche und nicht rechts davon angezeigt wird?
Es gibt im Allgemeinen zwei Lösungen für Layoutprobleme:
wechselt zur Verwendung des Rasters. Layouts wie das, was Sie erreichen möchten, werden so einfach. Grid kann wahrscheinlich 95% aller Layout-Probleme lösen (es ist erstaunlich, wenn man darüber nachdenkt - Tk macht mit einem Manager, was die meisten Toolkits brauchen ein halbes Dutzend zu erreichen!)
verwenden mehrere Frames. Wenn einige Widgets von oben nach unten und einige von links nach rechts gestapelt werden müssen, können Sie nicht immer das bekommen, was Sie wollen, alles in einem einzigen Frame zu packen. Verwenden Sie einen Rahmen für die oberen bis unteren Teile des Layouts und zusätzliche Rahmen für den Inhalt von links nach rechts.
Stellen Sie außerdem fest, dass Widgets keine Kinder des Widgets sein müssen, in dem sie gepackt / gerastert sind. Sie können den Parameter "in" verwenden, um Widgets in einen anderen Container als den übergeordneten Container einzufügen.
In Ihrem speziellen Beispiel können Sie beispielsweise drei Rahmen erstellen: oben, Mitte, unten. Packen Sie diese von oben nach unten in Ihr Toplevel-Fenster. Dann können Sie das erste Text-Widget oben, die Schaltfläche oder die Schaltflächen horizontal in der Mitte und das andere Text-Widget unten einfügen.
Der Vorteil eines solchen Ansatzes ist, dass es viel einfacher ist, das Layout in der Zukunft zu ändern (was meiner Erfahrung nach immer passiert). Sie müssen keines Ihrer Widgets erneut parieren, sondern nur packen / platzieren / in einem anderen Container rasteren.
In Ihrem kurzen Beispiel macht es keinen großen Unterschied, aber für komplexe Apps kann diese Strategie ein Lebensretter sein.
Mein bester Rat lautet: Layout ist kein nachträglicher Einfall. Machen Sie ein wenig Planung, verbringen Sie vielleicht sogar fünf Minuten mit dem Zeichnen von Millimeterpapier. Entscheide dich zunächst für die wichtigsten Bereiche deiner App und verwende für jeden einen Rahmen oder einen anderen Container (Fenster, Notizbuch usw.). Sobald Sie diese haben, machen Sie für jeden Abschnitt den gleichen "Teile-und-herrsche" Ansatz. Auf diese Weise können Sie verschiedene Arten von Layout für verschiedene Bereiche Ihrer App verwenden. Symbolleisten erhalten horizontales Layout, Formulare können vertikales Layout erhalten usw.
Ich habe zuerst falsch verstanden, wie das Packen funktionierte, und nicht gemerkt, dass die gesamte linke Seite "beansprucht" wurde, als ich x.pack(side=LEFT)
tat. Was ich nach dem Lesen von diesem gefunden habe und die Antwort von Alex hier ist, dass ich nicht wirklich danach war, x
gepackt zu haben linke Seite überhaupt, sondern eher verankert nach links, mit anchor=W
(W für West) statt side=LEFT
. Mein überarbeiteter Codeausschnitt, der das macht, nach dem ich gesucht habe, sieht so aus:
Auf diese Weise wird x
nicht mehr die linke Seite "beanspruchen", sondern sie wird nur innerhalb ihres Raumblocks nach links (oder West) ausgerichtet.
Das Packen erfolgt in der Reihenfolge, in der die .pack-Methoden aufgerufen werden. Wenn x also die linke Seite "beansprucht" hat, dann ist es der linke Teil des Elternteils und alles andere innerhalb des Elternteils wird es sein Recht. Sie benötigen einen Frame zum "vermitteln", z. B. ....:
%Vor%(Texte wurden in Buttons geändert, um nur die Sichtbarkeit des Layouts zu verbessern - der Tkinter auf diesem Mac zeigt die Texte nicht deutlich an, bis sie den Fokus haben, aber die Buttons sind ziemlich klar; -).