Editar: A pesar de todo lo comentado a continuación funciona en Windows, la primera opción sería no trabajar en, por ejemplo, Ubuntu debido a tal vez un error. Una publicación anterior dada en los comentarios indica que el mismo problema se encuentra en OSX.
En cualquier caso, la segunda opción que utiliza medidores verticales funciona tanto en Ubuntu como en Windows para que pueda probarlo en OSX.
Su texto tiene la instrucción a alinearse en la forma que desee con wx.ALIGN...
y, de hecho, se alinea. Sin embargo, el tamaño de StaticText no es el del panel, sino solo el tamaño del texto. Habiendo restringido su posición a su propio tamaño, no puede ver la diferencia entre los modos de alineación.
tiene dos opciones para resolver el problema:
Opción 1. Ampliar el tamaño de widget de StaticText y colocar su texto en él
Se podría ampliar el tamaño de su widget StaticText usando su parámetro size
. Esta es una solución incorrecta, excepto para padres o marcos de tamaño fijo, que no van a cambiar de tamaño ni a reutilizar en otras aplicaciones. Si el tamaño del widget que contiene el texto cambia, la posición relativa del texto también se modificará porque su tamaño permanece fijo. Por lo tanto, siempre es mejor organizar sus widgets por medio de sizers.
La proporción del espacio disponible el widget ocupa en la ranura sizer está dado por el segundo parámetro en sizer.Add()
(0
el tamaño mínimo, 1
es la ocupación completa):
sizer_2.Add(self.label_1, 0, 0, 0)
Para vea el texto alineado en el panel como desee, debe indicarle a StaticText que se expanda a todo el espacio disponible:
sizer_2.Add(self.label_1, 1, 0, 0)
Aquí tienes el código correspondiente:
class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
wx.Frame.__init__(self, *args, **kwds)
self.panel_1 = wx.Panel(self, -1)
self.label_1 = wx.StaticText(self.panel_1, -1, "label_1", style=wx.ALIGN_RIGHT)
self.panel_2 = wx.Panel(self, -1)
self.label_2 = wx.StaticText(self.panel_2, -1, "label_2", style=wx.ALIGN_CENTRE)
self.panel_3 = wx.Panel(self, -1)
self.label_3 = wx.StaticText(self.panel_3, -1, "label_3")
self.panel_1.SetBackgroundColour(wx.Colour(0, 255, 0))
self.panel_2.SetBackgroundColour(wx.Colour(0, 255, 255))
self.panel_3.SetBackgroundColour(wx.Colour(219, 112, 147))
sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
sizer_4 = wx.BoxSizer(wx.HORIZONTAL)
sizer_2.Add(self.label_1, 1, 0, 0)
sizer_3.Add(self.label_2, 1, 0, 0)
sizer_4.Add(self.label_3, 1, 0, 0)
self.panel_1.SetSizer(sizer_2)
self.panel_2.SetSizer(sizer_3)
self.panel_3.SetSizer(sizer_4)
sizer_1.Add(self.panel_1, 1, wx.EXPAND, 0)
sizer_1.Add(self.panel_2, 1, wx.EXPAND, 0)
sizer_1.Add(self.panel_3, 1, wx.EXPAND, 0)
self.SetSizer(sizer_1)
sizer_1.Fit(self)
self.Layout()
Nota que el código está más tiempo del necesario con el fin de imitar su ejemplo con tres paneles. Obtiene la misma vista de marco usando un solo panel. De hecho, podría simplificarse aún más no el uso de paneles y ajuste de la StaticText directamente en el sizer:
class MyFrame2(wx.Frame):
def __init__(self, *args, **kwds):
wx.Frame.__init__(self, *args, **kwds)
self.label_1 = wx.StaticText(self, -1, "label_1", style=wx.ALIGN_RIGHT)
self.label_2 = wx.StaticText(self, -1, "label_2", style=wx.ALIGN_CENTRE)
self.label_3 = wx.StaticText(self, -1, "label_3")
self.label_1.SetBackgroundColour(wx.Colour(127, 255, 0))
self.label_2.SetBackgroundColour(wx.Colour(0, 255, 255))
self.label_3.SetBackgroundColour(wx.Colour(219, 112, 147))
sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(self.label_1, 1, wx.EXPAND, 0)
sizer.Add(self.label_2, 1, wx.EXPAND, 0)
sizer.Add(self.label_3, 1, wx.EXPAND, 0)
self.SetSizer(sizer)
sizer.Fit(self)
self.Layout()
Opción 2. Localizar el widget sí mismo en la posición deseada en el espacio disponible de la sizer. Puede usar el parámetro position
de StaticText
para tal fin. Pero esto tendría los mismos problemas indicados anteriormente para el uso de size
. Así que de nuevo quieres controlar la geometría de tus vistas con sizers. a colocar el widget en el medidor usando uno de:
sizer_6.Add(self.label_5, 0, wx.ALIGN_RIGHT, 0)
o
sizer_7.Add(self.label_6, 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
Por alguna razón, para que esto funcione se necesita un BoxSizer
(y de la misma manera vertical, si lo haría gustaría usar wx.ALIGN_CENTER_VERTICAL se necesita una horizontal BoxSizer
:
class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
wx.Frame.__init__(self, *args, **kwds)
self.panel_4 = wx.Panel(self, -1)
self.label_5 = wx.StaticText(self.panel_4, -1, "label_5")
self.panel_5 = wx.Panel(self, -1)
self.label_6 = wx.StaticText(self.panel_5, -1, "label_6")
self.panel_6 = wx.Panel(self, -1)
self.label_7 = wx.StaticText(self.panel_6, -1, "label_7")
self.panel_4.SetBackgroundColour(wx.Colour(0, 255, 255))
self.panel_5.SetBackgroundColour(wx.Colour(127, 255, 0))
self.panel_6.SetBackgroundColour(wx.Colour(219, 112, 219))
sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
sizer_8 = wx.BoxSizer(wx.VERTICAL)
sizer_7 = wx.BoxSizer(wx.VERTICAL)
sizer_6 = wx.BoxSizer(wx.VERTICAL)
sizer_6.Add(self.label_5, 0, wx.ALIGN_RIGHT, 0)
sizer_7.Add(self.label_6, 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
sizer_8.Add(self.label_7, 0, 0, 0)
self.panel_4.SetSizer(sizer_6)
self.panel_5.SetSizer(sizer_7)
self.panel_6.SetSizer(sizer_8)
sizer_1.Add(self.panel_4, 1, wx.EXPAND, 0)
sizer_1.Add(self.panel_5, 1, wx.EXPAND, 0)
sizer_1.Add(self.panel_6, 1, wx.EXPAND, 0)
self.SetSizer(sizer_1)
sizer_1.Fit(self)
self.Layout()
Esta opción implica una combinación de paneles y medidores th at produce un código que es más difícil de simplificar que el que se muestra para la primera opción.
Duplicado: http://stackoverflow.com/questions/8587060/wxpython-text-alignment-does-not-work/8612146#8612146 –
Quizás pueda agregar información sobre su entorno de prueba (SO, versión de Python, versión de wxPython) –