2011-12-25 95 views
6

我正在使用wxPython來構建一個GUI,我試圖對齊一些文本,但它根本不工作。 我試圖在三個獨立的面板中的三個位置(右對齊,居中對齊和左對齊)對齊三個不同的靜態文本項目。我得到的結果是,所有三個靜態文本控件都在其各自面板的左上角對齊。 text not aligned爲什麼我的文本在wxPython中沒有正確對齊?

這是我的代碼有:

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) 

我如何解決這個問題的任何想法?

謝謝!

我運行MAC OSX 10.7.2使用Python 2.7.1和wxPython的2.8.12.1

+0

Duplicate:http://stackoverflow.com/questions/8587060/wxpython-text-alignment-does-not-work/8612146#8612146 – 2011-12-25 01:20:08

+0

也許你可以添加有關你的測試環境(操作系統,Python版本,wxPython版本)。 – 2011-12-25 01:26:53

回答

13

編輯:儘管一切都在下面評論在Windows上運行,第一個選項是行不通的,對例如,Ubuntu可能是一個bug。在評論中給出的以前的帖子表明在OSX中也發現了同樣的問題。
在任何情況下,使用垂直分割器的第二個選項在Ubuntu和Windows中都可以使用,因此您可以在OSX上使用它。


您的文字有指令要與wx.ALIGN...的方式排列,事實上,它對齊。但是,StaticText的大小不是面板的大小,而只是文本的大小。將其位置限制在自己的大小後,您將看不到對齊模式之間的差異。

有兩個選項來解決這個問題:

選項1.展開StaticText窗口小部件的大小和它的定位文本

你可以使用它的size參數擴展您的StaticText窗口小部件的大小。除了固定大小的父母或框架,您不會在其他應用程序中更改大小或重新使用外,這是一個糟糕的解決方案。如果包含文本的小部件的大小發生變化,那麼文本的相對位置也將被修改,因爲它的大小保持不變。所以最好通過sizer來組織你的小部件。

的可用空間的微件中的分級機槽佔據的比例是由第二個參數在sizer.Add()給出(0是最小尺寸,1充滿職業):

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

enter image description here

要請參閱面板中對齊的文本,因爲您需要告訴StaticText擴展到所有可用空間:

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

enter image description here

在這裏你有相關的代碼:

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

注長於需要的,以便與三塊板,以模擬天生您的示例代碼。您只使用一個面板獲得相同的框架視圖。事實上,它可以進一步不使用板和直接在分級機設置靜態文本被簡化:

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

選項2在分級器的可用空間找到插件本身在期望的位置。 您可以使用position參數StaticText來達到此目的。但是,如果使用size,則會出現上述相同的問題。所以你又想用sizer來控制視圖的幾何形狀。 您使用的一個在篩分器定位插件:

sizer_6.Add(self.label_5, 0, wx.ALIGN_RIGHT, 0) 

sizer_7.Add(self.label_6, 0, wx.ALIGN_CENTER_HORIZONTAL, 0) 

出於某種原因,這個工作你需要一個垂直BoxSizer(並以同樣的方式,如果你想喜歡用wx.ALIGN_CENTER_VERTICAL您將需要一個水平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() 

這種選擇意味着面板和施膠劑次的組合at產生的代碼比第一個選項更難以簡化。

+1

哦,上帝!,我來到我自己的答案!謝謝me_in_the_past,把你的時間花在回答這些問題上如此簡單 – joaquin 2015-09-13 17:45:48

0

我認爲文字沒有對齊,因爲沒有設置大小。嘗試:

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) 

它將對齊200 * 20框內。默認情況下,大小是「自動」,即(-1,-1),即只是足夠讓文本可見,並且在該框中對齊將不會給可見的效果。

However, this does not always work

+0

'但是,這並不總是奏效。「因爲你做錯了。如果以這種方式設置文本的大小,則設置的是FIX大小,因此當您更改框架的大小時,文本的中心,正確位置會丟失。如果要保持文本與框架/面板的大小無關,則必須使用大小調整器。看到我的答案。儘管downvoted它總是工作 – joaquin 2011-12-25 10:40:14

+0

'但是,這並不總是工作。對不起,如果你用wxPython 2.8.10.1來使用Ubuntu,那就是真的了。相反,它在Windows上工作。在Ubuntu中,你可以在我的答案中使用第二種測試策略。 – joaquin 2011-12-25 13:06:38

相關問題