2011-12-25 24 views
6

Estoy usando wxPython para construir una GUI y estoy tratando de alinear algunos textos pero no funciona en absoluto. Estoy intentando alinear tres elementos de texto estático diferentes en tres lugares (alineados a la derecha, alineados a la izquierda y alineados a la izquierda) en tres paneles separados. El resultado que estoy obteniendo es que los tres controles estáticos de texto están alineados en las esquinas superiores izquierdas de sus respectivos paneles. text not aligned¿por qué mi texto no se alinea correctamente en wxPython?

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 puedo solucionar esto?

¡Gracias!

estoy ejecutando Mac OS X 10.7.2 con Python 2.7.1 y wxPython 2.8.12.1

+0

Duplicado: http://stackoverflow.com/questions/8587060/wxpython-text-alignment-does-not-work/8612146#8612146 –

+0

Quizás pueda agregar información sobre su entorno de prueba (SO, versión de Python, versión de wxPython) –

Respuesta

13

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) 

enter image description here

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) 

enter image description here

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

enter image description here

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.

+1

¡oh Dios!, ¡Vine a mi propia respuesta! Gracias me_en_the_past, dedicar tu tiempo a responder estas preguntas en SO tan largo – joaquin

0

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

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. De forma predeterminada, el tamaño es "automático", es decir, (-1, -1), es decir, lo suficiente para que el texto sea visible, y alinearlo en ese cuadro no dará efecto visible.

However, this does not always work.

+0

'Sin embargo, esto no siempre funciona.'Porque lo estás haciendo mal. Si configura el tamaño del texto de esta manera, está configurando un tamaño FIX para que cuando cambie el tamaño de su marco, el centro, las posiciones correctas del texto se pierdan. Si desea mantener su texto alineado independientemente del tamaño de su marco/panel, debe usar los clasificadores. Ver mi respuesta A pesar de downvoted siempre funciona – joaquin

+0

'Sin embargo, esto no siempre funciona'. Lo siento, eso es cierto si estás usando Ubuntu con wxPython 2.8.10.1. Por el contrario, funciona en Windows. En ubuntu puedes usar la segunda estrategia probada en mi respuesta. – joaquin

Cuestiones relacionadas