为什么我的wxPython文本对齐不正确?
我正在用wxPython来制作一个图形界面(GUI),但是我想对齐一些文本,却完全没有成功。
我想在三个不同的面板中对齐三个静态文本项,分别是右对齐、居中对齐和左对齐。但是我得到的结果是,所有三个静态文本控件都被对齐到了各自面板的左上角。

这是我写的代码:
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
3 个回答
我觉得文本没有对齐是因为没有设置大小。你可以试试:
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),这意味着只够让文本显示出来,而在这个框里对齐就不会有明显的效果。
编辑:虽然下面评论的内容在Windows上都能正常工作,但第一个选项在Ubuntu上可能会因为某个bug而无法使用。评论中提到的一个之前的帖子也表明,OSX上也会出现同样的问题。
无论如何,第二个选项使用垂直布局在Ubuntu和Windows上都能正常工作,所以你可以在OSX上试试。
你的文本中有指令可以用
你有两个选项来解决这个问题:
选项1. 扩大StaticText控件的大小,并在上面放置你的文本。
你可以通过它的size
参数来扩大StaticText控件的大小。这种方法不太好,除非你有固定大小的父控件或框架,而这些控件的大小不会改变,也不会在其他应用中重用。如果包含文本的控件大小发生变化,那么文本的相对位置也会随之改变,因为它的大小是固定的。因此,最好还是通过布局管理器来组织你的控件。
控件在布局管理器中的占用空间比例由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()
注意,这段代码比实际需要的要长,以便模仿你有三个面板的例子。实际上,你只用一个面板也能得到相同的框架视图。事实上,它还可以进一步简化,不使用面板,直接在布局管理器上设置StaticText:
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. 将控件放置在布局管理器中可用空间的期望位置。
你可以使用StaticText
的position
参数来实现这一点。但这会有和使用size
一样的问题。因此,你还是想通过布局管理器来控制视图的几何形状。
你可以使用以下之一在布局管理器中定位控件:
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()
这个选项涉及到面板和布局管理器的组合,生成的代码比第一个选项的代码更难以简化。