2011-12-25 15 views
6

Sto usando wxPython per costruire una GUI e sto cercando di allineare del testo ma non funziona affatto. Sto provando ad allineare tre diversi elementi di testo statici in tre posizioni (allineato a destra, allineato al centro e allineato a sinistra) in tre pannelli separati. Il risultato che sto ottenendo è che tutti e tre i controlli di testo statici sono allineati negli angoli in alto a sinistra dei rispettivi pannelli. text not alignedperché il mio testo non si allinea correttamente in wxPython?

Questo è il codice che ho:

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) 

Delle idee su come risolvere il problema?

Grazie!

Io corro Mac OSX 10.7.2 con Python 2.7.1 e wxPython 2.8.12.1

+0

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

+0

Forse è possibile aggiungere informazioni sul proprio ambiente di testing (sistema operativo, versione Python, versione wxPython). –

risposta

13

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) 

enter image description here

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

enter image description here

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

enter image description here

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.

+1

oh dio!, Sono arrivato alla mia risposta !!! Grazie a me_in_the_past, per dedicare il tuo tempo a rispondere a queste domande su SO in modo così approfondito – joaquin

0

Penso che il testo non sia allineato perché la dimensione non è impostata. Prova:

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) 

E sarà allineato all'interno di una scatola 200 * 20. Per impostazione predefinita, la dimensione è "automatica", cioè (-1, -1), ovvero abbastanza per rendere visibile il testo, e l'allineamento in quella casella non darà l'effetto visibile.

However, this does not always work.

+0

'Tuttavia, questo non sempre funziona."Perché lo stai facendo male. Se si imposta la dimensione del testo in questo modo si imposta una dimensione di FIX in modo che quando si modifica la dimensione del frame al centro, le posizioni di destra del testo vengono perse. Se vuoi mantenere il tuo testo allineato indipendentemente dalla dimensione del tuo frame/pannello devi usare sizers. Vedi la mia risposta. Nonostante downvoted funziona sempre – joaquin

+0

'Tuttavia, questo non sempre funziona'. Scusa è vero se stai usando Ubuntu con wxPython 2.8.10.1. Al contrario, funziona su Windows. In Ubuntu puoi usare la seconda strategia testata sulla mia risposta. – joaquin

Problemi correlati