2009-08-14 7 views
10

Ich habe mehrere Schaltflächen in verschiedenen Sizer und sie erweitern in der Art, die ich will sie. Wenn ich jedoch das Elternelement zu einem neuen wx.BoxSizer hinzufüge, der zum Hinzufügen eines Rahmens um alle Elemente im Rahmen verwendet wird, funktioniert der Sizer, der hinzugefügt wurde, korrekt vertikal, aber nicht horizontal.wxPython: Elemente in BoxSizer nicht horizontal horizontal, nur vertikal

Der folgende Code demonstriert das Problem:

#! /usr/bin/env python 

import wx 
import webbrowser 

class App(wx.App): 


    def OnInit(self): 
     frame = MainFrame() 
     frame.Show() 
     self.SetTopWindow(frame) 
     return True 


class MainFrame(wx.Frame): 

    title = 'Title' 


    def __init__(self): 
     wx.Frame.__init__(self, None, -1, self.title) 

     panel = wx.Panel(self) 

     #icon = wx.Icon('icon.png', wx.BITMAP_TYPE_PNG) 
     #self.SetIcon(icon) 

     sizer = wx.FlexGridSizer(rows=2, cols=1, vgap=10, hgap=10) 

     button1 = wx.Button(panel, -1, 'BUTTON') 
     sizer.Add(button1, 0, wx.EXPAND) 

     buttonSizer = wx.FlexGridSizer(rows=1, cols=4, vgap=10, hgap=5) 

     buttonDelete = wx.Button(panel, -1, 'Delete') 
     buttonSizer.Add(buttonDelete, 0, 0) 

     buttonEdit = wx.Button(panel, -1, 'Edit') 
     buttonSizer.Add(buttonEdit, 0, 0) 

     buttonNew = wx.Button(panel, -1, 'New') 
     buttonSizer.Add(buttonNew, 0, 0) 

     buttonSizer.AddGrowableCol(0, 0) 

     sizer.Add(buttonSizer, 0, wx.EXPAND|wx.HORIZONTAL) 

     sizer.AddGrowableCol(0, 0) 
     sizer.AddGrowableRow(0, 0) 

     mainSizer = wx.BoxSizer(wx.EXPAND) 
     mainSizer.Add(sizer, 0, wx.EXPAND|wx.ALL, 10) 

     #panel.SetSizerAndFit(sizer) 
     #sizer.SetSizeHints(self) 
     panel.SetSizerAndFit(mainSizer) 
     mainSizer.SetSizeHints(self) 


if __name__ == '__main__': 
    app = App(False) 
    app.MainLoop() 

Linien und und Auskommentierung Linien und entfernt die zusätzlichen BoxSizer und zeigt kommentiert, wie ich alle Funktion erwarten (natürlich ohne Whitespace).

Ich bin vollständig mit diesem Problem fest und habe immer noch keine Ahnung, wie es zu beheben ist.

Antwort

24

Zunächst werden einige Flags falsch übergeben. BoxSizer benötigt wx.HORIZONTAL oder wx.VERTICAL, nicht wx.EXPAND. Sizer.Add nimmt wx.HORIZONTAL nicht.

Wenn Sie einen VERTICAL BoxSizer haben, wird wx.EXPAND das Steuerelement horizontal ausfüllen lassen, während ein Anteil von 1 oder mehr (zweites Argument für Add) das Steuerelement vertikal füllen wird. Bei HORIZONTAL BoxSizern ist das Gegenteil der Fall.

sizer = wx.BoxSizer(wx.VERTICAL) 
sizer.Add(widget1, 0, wx.EXPAND) 
sizer.Add(widget2, 1) 

widget1 wird horizontal erweitert. widget2 wird vertikal expandieren.

Wenn Sie einen Sizer in einen anderen Sizer einfügen, müssen Sie sicherstellen, dass die Proportionen und die EXPAND-Flags so gesetzt sind, dass die Innenseiten so wachsen, wie Sie möchten.

Ich überlasse Ihnen den Rest.