¿Por qué mi texto no se alinea correctamente en wxPython?

Estoy usando wxPython para construir una GUI y estoy tratando de alinear un texto pero no funciona en absoluto. Estoy intentando alinear tres elementos diferentes de texto estático en tres lugares (alineado a la derecha, alineado al centro y alineado a la izquierda) en tres paneles separados. El resultado que estoy obteniendo es que los tres controles de texto estático están alineados en las esquinas superiores izquierdas de sus respectivos paneles. texto no alineado

Este es el código que tengo:

self.lastText=wx.StaticText(self.textDisplayPanel1, label=self.lastWords, style=wx.ALIGN_RIGHT) self.currentText=wx.StaticText(self.textDisplayPanel2, label=self.currentWords, style=wx.ALIGN_CENTRE) self.nextText=wx.StaticText(self.textDisplayPanel3, label=self.nextWords, style=wx.ALIGN_LEFT) 

¿Alguna idea sobre cómo arreglo esto?

¡Gracias!

Estoy ejecutando mac OSX 10.7.2 con Python 2.7.1 y wxPython 2.8.12.1

Edición: Aunque todo lo que se comenta a continuación funciona en Windows, la primera opción no funcionaría, por ejemplo, en Ubuntu debido a 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 usa el tamaño vertical funciona tanto en Ubuntu como en Windows para que pueda probarlo en OSX.


Su texto tiene la instrucción de alinearse de la forma que desee con wx.ALIGN... y, de hecho, está alineado. Sin embargo, el tamaño del texto estático no es el del panel, sino 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.

Tienes dos opciones para resolver el problema:

Opción 1. Expanda el tamaño del widget StaticText y coloque su texto en él

Puede ampliar el tamaño de su widget StaticText utilizando su parámetro de size . Esta es una mala solución, excepto para los padres o marcos de tamaño fijo que no cambiará de tamaño ni 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 eso siempre es mejor organizar tus widgets por medio de calibradores.

La proporción del espacio disponible que ocupa el widget en la ranura del medidor viene dada por el segundo parámetro en sizer.Add() ( 0 es el tamaño mínimo, 1 es la ocupación completa):

 sizer_2.Add(self.label_1, 0, 0, 0) 

introduzca la descripción de la imagen aquí

Para ver el texto alineado en el panel como desee, debe indicar al texto estático que se expanda a todo el espacio disponible:

 sizer_2.Add(self.label_1, 1, 0, 0) 

introduzca la descripción de la imagen aquí

Aquí tienes el código relevante:

 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() 

introduzca la descripción de la imagen aquí

Tenga en cuenta que el código es más largo del necesario para imitar su ejemplo con tres paneles. Obtienes la misma vista de marco usando un único panel. De hecho, se podría simplificar aún más si no se usan paneles y se establece el texto estático directamente en el medidor:

 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. Localice el widget en la posición deseada en el espacio disponible del medidor. Podría usar el parámetro de position de StaticText para ese propósito. Pero esto tendría los mismos problemas indicados anteriormente para el uso del size . Así que de nuevo, quieres controlar la geometría de tus vistas con los calibradores. Posiciona 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, necesita un BoxSizer vertical (y de la misma manera, si desea usar wx.ALIGN_CENTER_VERTICAL, necesitará un BoxSizer horizontal:

 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 tamaños que produce un código que es más difícil de simplificar que el que se muestra para la primera opción.

Creo que el texto no está alineado porque el tamaño no está establecido. Tratar:

 t1=wx.StaticText(smth, label="foo", pos=(0,0), size=(200,20), style=wx.ALIGN_RIGHT) t2=wx.StaticText(smth, label="bar", pos=(0,0), size=(200,20), style=wx.ALIGN_CENTRE) 

Y se alineará dentro de una caja de 200 * 20. Por defecto, el tamaño es “automático”, es decir (-1, -1), es decir, lo suficiente para que el texto sea visible, y la alineación en ese cuadro no dará efecto visible .

Sin embargo, esto no siempre funciona .