Edit: Anche se tutto commentato di seguito funziona su Windows, la prima opzione non funziona su, per esempio, Ubuntu a causa forse di un bug. Un post precedente indicato nei commenti indica che lo stesso problema si trova in OSX.
In ogni caso, la seconda opzione che utilizza i sizer verticali funziona sia in Ubuntu che in Windows, quindi è possibile provarlo su OSX.
Il testo ha l'istruzioni per allineare in modo che si desidera con wx.ALIGN...
e, di fatto, si è allineato. Tuttavia la dimensione di StaticText non è quella del pannello ma solo la dimensione del testo. Avendo limitato la sua posizione alle proprie dimensioni, non è possibile vedere la differenza tra le modalità di allineamento.
si hanno due opzioni per risolvere il problema:
Opzione 1. Espandere la dimensione widget di StaticText e posizionare il testo su di esso
Si potrebbe espandere le dimensioni del tuo widget StaticText utilizzando il suo parametro size
. Questa è una soluzione pessima, fatta eccezione per i genitori o i frame di dimensioni fisse, che non cambierete dimensioni o riutilizzati in altre applicazioni. Se la dimensione del widget che contiene il testo cambia, anche la posizione relativa del testo verrà modificata perché la sua dimensione rimane fissa. Quindi è sempre meglio organizzare i tuoi widget per mezzo di sizers.
La percentuale dello spazio disponibile widget occupa nello slot sizer è data dal secondo parametro sizer.Add()
(0
è minimo ingombro, 1
è piena occupazione):
sizer_2.Add(self.label_1, 0, 0, 0)

Per vedi il testo allineato nel pannello come vuoi devi dire a StaticText di espandersi a tutto lo spazio disponibile:

Qui avete il codice relativo:
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()

Annotare il codice è più lungo di quanto necessario al fine di mimare il tuo esempio con tre pannelli. Si ottiene la stessa vista del frame usando un solo pannello. In effetti, potrebbe essere ulteriormente semplificata se non utilizzano pannelli e impostando lo StaticText direttamente sul 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()
Opzione 2. Individuare il widget stesso nella posizione desiderata nello spazio disponibile del sizer. È possibile utilizzare il parametro position
di StaticText
a tale scopo. Ma questo avrebbe gli stessi problemi sopra indicati per l'uso di size
. Quindi di nuovo vuoi controllare la geometria delle tue visualizzazioni con i sizers. si posiziona il widget nella sizer utilizzando uno dei:
sizer_6.Add(self.label_5, 0, wx.ALIGN_RIGHT, 0)
o
sizer_7.Add(self.label_6, 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
Per qualche ragione, per far funzionare tutto questo è necessario un BoxSizer
(e allo stesso modo verticale, se si farebbe desidera utilizzare wx.ALIGN_CENTER_VERTICAL avrete bisogno di un orizzontale 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()
Questa opzione implica una combinazione di pannelli e sizers TH a produce un codice che è più difficile da semplificare di quello mostrato per la prima opzione.
Duplicato: http://stackoverflow.com/questions/8587060/wxpython-text-alignment-does-not-work/8612146#8612146 –
Forse è possibile aggiungere informazioni sul proprio ambiente di testing (sistema operativo, versione Python, versione wxPython). –