为什么我的文本在wxPython中没有正确对齐?
我正在使用wxPython来构建一个GUI,我试图对齐一些文本,但它根本不工作。 我试图在三个独立的面板中的三个位置(右对齐,居中对齐和左对齐)对齐三个不同的静态文本项目。我得到的结果是,所有三个静态文本控件都在其各自面板的左上角对齐。 为什么我的文本在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
编辑:尽管一切都在下面评论在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)
要请参阅面板中对齐的文本,因为您需要告诉StaticText扩展到所有可用空间:
sizer_2.Add(self.label_1, 1, 0, 0)
在这里你有相关的代码:
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()
注长于需要的,以便与三块板,以模拟天生您的示例代码。您只使用一个面板获得相同的框架视图。事实上,它可以进一步不使用板和直接在分级机设置静态文本被简化:
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产生的代码比第一个选项更难以简化。
哦,上帝!,我来到我自己的答案!谢谢me_in_the_past,把你的时间花在回答这些问题上如此简单 – joaquin 2015-09-13 17:45:48
我认为文字没有对齐,因为没有设置大小。尝试:
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),即只是足够让文本可见,并且在该框中对齐将不会给可见的效果。
Duplicate:http://stackoverflow.com/questions/8587060/wxpython-text-alignment-does-not-work/8612146#8612146 – 2011-12-25 01:20:08
也许你可以添加有关你的测试环境(操作系统,Python版本,wxPython版本)。 – 2011-12-25 01:26:53