2011-12-25 94 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

相关问题