wxPython: los elementos en BoxSizer no se expanden horizontalmente, solo verticalmente

Tengo varios botones en varios tamaños y se expanden de la manera que yo quiero. Sin embargo, cuando agrego el padre a un nuevo wx.BoxSizer que se usa para agregar un borde alrededor de todos los elementos en el marco, el medidor que se ha agregado funciona correctamente verticalmente, pero no horizontalmente.

El siguiente código demuestra el problema:

#! /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() 

Al comentar las líneas 57 y 58 y las líneas 55 y 56 sin comentarios, elimina el BoxSizer adicional y muestra cómo espero que todo funcione (sin el espacio en blanco, por supuesto).

Estoy completamente atascado con este problema y todavía no tengo ni idea de cómo solucionarlo.

En primer lugar, estás pasando algunas banderas incorrectamente. BoxSizer toma wx.HORIZONTAL o wx.VERTICAL, no wx.EXPAND. sizer.Add no toma wx.HORIZONTAL.

Si tiene un BoxSizer VERTICAL, wx.EXPAND hará que el control se llene horizontalmente, mientras que una proporción de 1 o más (segundo argumento a Agregar) hará que el control se llene verticalmente. Es lo opuesto para los BoxSizers HORIZONTALES.

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

widget1 se expandirá horizontalmente. widget2 se expandirá verticalmente.

Si coloca un medidor en otro medidor, debe asegurarse de tener su proporción y los indicadores de EXPANDA establecidos para que su interior crezca de la manera en que lo desea.

Te dejo el rest a ti.