C4S3 hat geschrieben:Ein Textcontrol, das als Parent das Panel hat und in der nächsten Zeile wird aber genau diese Objekt an die Vbox übergeben. Das verstehe icht nicht. Wie hängen dies zusammen? Sorgt die Box nicht dafür, dass das Panel vergrößert/verkleinert wird und mit ihm auch sein Inhalt?
Hallo C4S3!
Also, die Sache ist eigentlich ganz einfach.
Ein Widget muss auf einem Container liegen. Frames, Dialogs, Panels und noch so ein paar Objekte sind solche Container.
Sizer sind keine Container. Sizer sind unsichtbare "Helfer", die sich **nur** darum kümmern, dass die Widgets auf dem Container korrekt angeordnet werden.
Man kann einem Container einen Sizer zuweisen. Dieser Sizer ist dann nur für die Anordnung der Widgets auf diesem Container zuständig.
Code: Alles auswählen
panel = wx.Panel(parent = self)
vbox = wx.BoxSizer(wx.VERTICAL)
panel.SetSizer(vbox)
Wenn ich jetzt ein neues Widget erstelle, dann lege ich es schon beim Erstellen auf einen Container.
Damit liegt das Widget schon auf dem Container, aber es ist noch nicht korrekt angeordnet. Dafür binde ich das neue Widget zusätzlich an einen Sizer.
Jetzt könntest du fragen, warum macht das wxPython nicht automatisch? Es wurde dem Container ja schon ein Sizer zugeordnet. -- Die Antwort ist: Man kann an so einen unsichtbaren Sizer, nicht nur Widgets, sondern auch Sizer zuordnen. Dadurch, dass an einen Sizer auch noch andere Sizer gebunden werden können, kann man die vielfältigsten Layouts generieren. Aber wxPython kann nicht automatisch wissen, welcher Sizer jetzt für das neue, soeben in den Container gelegte, Widget zuständig ist. Deshalb machen wir das selbst. Wir binden das neue Widget selbst an einen Sizer und geben dabei auch noch an, wie und wo und mit welchem Abstand usw. das neue Widget vom Sizer angeordnet werden soll.
Code: Alles auswählen
vbox.Add(txt, proportion = 0, flag = wx.EXPAND | wx.ALL, border = 10)
Damit wird jetzt das neue TextCtrl, an den Sizer ``vbox`` gebunden. ``proportion`` gibt an, wie viel Teile des Gesamtplatzes von diesem Widget ausgefüllt werden soll. Bei einem vertikalen BoxSizer ist damit der Platz nach unten gemeint. Eine 0 gibt an, dass das Widget nur so viel Platz bekommt, wie viel es gerade mal benötigt.
Zahlen > 0 geben die Teile an. Gibt es im gesamten Sizer nur ein Widget und ist die Proportion dieses Widgets 1, dann wird es die gesamte Größe des Sizers ausfüllen.
Kommt noch ein zweites Widget dazu und ist dessen Proportion 2, dann wird das erste Widget ein Drittel und das zweite Widget zwei Drittel des Platzes von oben nach unten ausfüllen.
Mit dem Flag wx.EXPAND gibt man an, dass das Widget den gesamten Bereich innerhalb des Sizers, von links nach rechts ausfüllen soll. Bei einer vertikalen Box ist die Proportion immer auf den vertikalen Bereich bezogen. wx.EXPAND bezieht sich damit bei einer vertikalen Box auf den horizontalen Bereich.
Bei einer horizontalen Box ist die Proportion immer auf den horizontalen Bereich innerhalb dieses Sizers bezogen. wx.EXPAND bezieht sich damit bei einer horizontalen Box auf den vertikalen Bereich.
Aber ich glaube, in wxPython in Action wird das viel schöner erklärt.
EDIT:
Nachzulesen in "wxPython in Action" auf den Seiten 323 bis 355.
mfg
Gerold
