为什么我的文字在wxPython中没有正确对齐?

时间:2011-12-25 01:01:31

标签: python wxpython alignment wxwidgets

我正在使用wxPython来构建一个GUI,我正在尝试对齐一些文本,但它根本不起作用。 我正尝试在三个单独的面板中将三个不同的静态文本项对齐(右对齐,中心对齐和左对齐)。我得到的结果是,所有三个静态文本控件都在各自面板的左上角对齐。 text not aligned

这是我的代码:

    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)

关于我如何解决此问题的任何想法?

谢谢!

我正在使用Python 2.7.1和wxPython 2.8.12.1运行mac OSX 10.7.2

3 个答案:

答案 0 :(得分:13)

编辑虽然下面评论的所有内容都适用于Windows,但第一个选项无法使用,例如Ubuntu,因为可能存在错误。评论中给出的上一篇文章表明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

请注意,代码比所需的时间长,以便使用三个面板模仿您的示例。只使用一个面板即可获得相同的框架视图。事实上,它可以进一步简化,不使用面板并直接在sizer上设置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。将小部件本身定位在大小调整器可用空间的所需位置。 您可以使用position StaticText参数来实现此目的。但是,对于size的使用,这将具有上述相同的问题。因此,您希望再次使用sizer控制视图的几何体。 您可以使用以下方法之一将小部件放置在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()

此选项意味着面板和大小调整器的组合产生的代码比第一个选项显示的代码更难简化。

答案 1 :(得分: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的盒子内对齐。默认情况下,大小为“auto”,即(-1,-1),即刚好足以使文本可见,并且在该框中对齐将不会给出可见效果。

However, this does not always work

答案 2 :(得分:-1)

昨天我也遇到了同样的问题,我使用的是MAC OS X,wxpython 4.0.6。 最后,我发现此脚本适合我。

我意识到,如果您最后没有使用SetSizer,则静态文本将不会居中对齐。

My code