2011-01-15 8 views
6

Ich verwende einen GridBacksizer, um zwei Panels innerhalb eines Frames zu platzieren.Platzieren von Elementen (Panels) in einem wx.GridBagSizer

control_panel = wx.Panel(self, id=ID_CONTROL_PANEL) 
main_panel = wx.Panel(self, id=ID_MAIN_PANEL) 

frame_sizer = wx.GridBagSizer(1, 1) 
frame_sizer.Add(control_panel, (0, 0), (2, 5), flag=wx.EXPAND) 
frame_sizer.Add(main_panel, (2, 0), (5, 5), flag=wx.EXPAND) 
frame_sizer.AddGrowableRow(0) 
frame_sizer.AddGrowableCol(0) 
self.SetSizer(frame_sizer) 

Ich möchte das control_panel über dem main_panel (wie Sie oben sehen können). Dies ist jedoch die Ausgabe erhalte ich:

alt text

Ich weiß nicht, warum die obere Platte so viel größer als die Bodenplatte ist, wenn ich das Gegenteil angegeben haben. (2, 5) für die Oberseite und (5, 5) für die Unterseite. Es hat auch ein seltsames Verhalten, wenn ich es kleiner verkleinere, es gibt mir im Grunde, was ich will (siehe Bild unten), aber ich weiß nicht, wie ich das Verhältnis halten soll, wenn ich es wieder größer mache.

alt text

jedoch beim Starten größer Ändern der Größe (sogar um einen kleinen Betrag) Sie können (siehe unten) sehen Sie die Formen und Verhältnisänderung dramatisch in der anderen Richtung (mit dem Boden viel kleiner und die oberen viel größer worden).

alt text

Immer noch versuchen, diese Sizer zu lernen und dieses Problem mit einem der Beispiele nicht wirklich ich gesehen habe finden. Versuche auch, mit allen Parametern zu experimentieren und einige Tests durchzuführen und ich kann nicht herausfinden, was hier vor sich geht. Jede Hilfe würde sehr geschätzt werden.

EDIT: Bild unten hinzugefügt, um Kommentar unten zu unterstützen. alt text

Antwort

2

Persönlich würde ich einen BoxSizer in vertikaler Ausrichtung verwenden. Hier ist ein einfaches Beispiel:

import wx 

class MyForm(wx.Frame): 

    def __init__(self): 
     wx.Frame.__init__(self, None, wx.ID_ANY, "Tutorial") 

     # Add a panel so it looks the correct on all platforms 
     panel = wx.Panel(self, wx.ID_ANY) 

     control_panel = wx.Panel(panel) 
     control_panel.SetBackgroundColour("Yellow") 
     main_panel = wx.Panel(panel) 
     main_panel.SetBackgroundColour("Blue") 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(control_panel, 3, wx.EXPAND) 
     sizer.Add(main_panel, 1, wx.EXPAND) 
     panel.SetSizer(sizer) 

# Run the program 
if __name__ == "__main__": 
    app = wx.PySimpleApp() 
    frame = MyForm().Show() 
    app.MainLoop() 

Ich habe die Hintergrundfarbe von jedem Panel geändert, um es einfacher zu sagen, welches ist was. Beachten Sie, dass ich das Bedienfeld einen Anteil von 3 und das Hauptfeld ein Anteil von 1 gab Vielleicht möchten Sie auch einen Blick auf das Widget Inspection Tool nutzen, um Ihnen zu helfen zu visualisieren:

http://wiki.wxpython.org/Widget%20Inspection%20Tool

+0

Kann ich SetMaxSize trotzdem verwenden?Ich möchte, dass das obere Feld die gleiche Größe behält (in y, aber erweiterbar durch x), aber das untere Feld erweitert wird (in x und y). – johnharris85

+0

Ich bin mir nicht sicher ... Sie könnten es vielleicht mit verschachtelten Sizer für das obere Panel bekommen, aber ich weiß es nicht. –

1

Von den sieben Zeilen und fünf Spalten im Raster haben Sie nur die erste Zeile und die erste Spalte angegeben, die erweiterbar sein soll.

Das Bedienfeld belegt die erste Zeile, sodass es erweitert wird, um den verfügbaren Platz zu belegen.

Das wx.EXPAND-Flag hat nur eine Auswirkung, wenn sich die Zelle in einer wachsenden Zeile oder Spalte befindet.

+0

Danke, Ich habe alle Zeilen und Spalten mit einem Growable versehen und es sieht viel besser aus, aber ich möchte, dass das obere Panel sich auf eine bestimmte Größe ausdehnt und dann aufhört. Aber das untere Fenster kann bei der Größenänderung immer größer werden. Ist das möglich? – johnharris85

+0

Verwenden Sie SetMaxSize, um die Höhe des Steuerfelds zu begrenzen. Sie können auch die Höhe des Steuerfelds festlegen (mit SetSize) und die Zeilen, die es belegt, nicht vergrößern. Oder Sie können mit Proportionen spielen, indem Sie die Anzahl der wachsenden Zeilen ändern, die jede dieser beiden Panels umfasst. –

+0

Ich habe control_panel.SetMaxSize (wx.Size (150, 300)) hinzugefügt, aber es scheint nichts getan zu haben, ich kann es immer noch irgendwo erweitern. Zusätzlich (und das passiert, nachdem alle Reihen/Spalten anwachsen gelassen wurden), erscheint an den Rändern des Rahmens ein merkwürdiger Raum, wenn er auf bestimmte Formen skaliert wird (ich habe ein zusätzliches Bild davon oben hinzugefügt). – johnharris85

Verwandte Themen