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

为什么我的文本在wxPython中没有正确对齐?,python,wxpython,alignment,wxwidgets,Python,Wxpython,Alignment,Wxwidgets,我正在使用wxPython构建一个GUI,我正在尝试对齐一些文本,但它根本不起作用。 我尝试在三个单独的面板中的三个位置(右对齐、中对齐和左对齐)对齐三个不同的静态文本项。我得到的结果是,所有三个静态文本控件都在各自面板的左上角对齐。 这是我的代码: self.lastText=wx.StaticText(self.textDisplayPanel1, label=self.lastWords, style=wx.ALIGN_RIGHT) self.currentText=wx

我正在使用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)
有没有办法解决这个问题

谢谢大家!


我正在使用Python2.7.1和wxPython 2.8.12.1运行mac OSX 10.7.2编辑:尽管下面评论的所有内容都可以在windows上运行,但第一个选项在Ubuntu上不起作用,例如,由于可能存在错误。评论中给出的前一篇帖子表明,在OSX中也发现了同样的问题。
在任何情况下,第二个选择使用垂直大小器在Ubuntu和windows中都可以使用,因此您可以在OSX上尝试


您的文本具有按照您希望的方式与
wx.align…
对齐的指令,事实上,它是对齐的。但是,静态文本的大小不是面板的大小,而是文本的大小。将其位置限制为自身大小后,您无法看到对齐模式之间的差异

解决此问题有两种选择:

选项1。展开StaticText小部件的大小并将文本放置在其上

您可以使用StaticText小部件的
size
参数来扩展其大小。这是一个糟糕的解决方案,除了固定大小的父帧或帧,您不会更改大小或在其他应用程序中重用。如果包含文本的小部件的大小发生变化,则文本的相对位置也将被修改,因为其大小保持不变。因此,最好通过大小调整器来组织小部件

小部件在sizer插槽中占用的可用空间比例由
sizer.Add()
中的第二个参数给出(
0
为最小大小,
1
为完全占用):

要查看面板中对齐的文本,您必须告诉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()

请注意,代码比需要的长,以便用三个面板模仿您的示例。仅使用一个面板即可获得相同的结构件视图。事实上,不使用面板和直接在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。将小部件自身定位在施胶器可用空间的所需位置。 为此,您可以使用
StaticText
position
参数。但是,对于使用
大小
,上述问题也会出现。因此,您需要再次使用大小调整器控制视图的几何图形。 您可以使用以下方法之一将小部件定位到sizer中:

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

出于某种原因,您需要一个垂直的
BoxSizer
(同样,如果您想使用wx.ALIGN\u CENTER\u 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()

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

我认为文本未对齐,因为未设置大小。请尝试:

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),即刚好足够文本可见,在该框中对齐不会产生可见效果


.

我昨天也遇到了同样的问题,我使用MacOSX,WxPython4.0.6。 最后我发现这个脚本适合我

我意识到,如果你最后不设置设置器,静态文本将不会在中心对齐


Duplicate:也许您可以添加有关测试环境的信息(操作系统、Python版本、wxPython版本).
但是,这并不总是有效。
因为你做得不对。如果你这样设置文本的大小,你就是在设置固定大小,因此当你更改框架的大小时,文本的中心位置会丢失。如果你想让文本与框架/面板的大小独立对齐,你必须使用大小调整器。请参阅我的答案。尽管被否决,但它总是有效的
,然而,这并不总是有效的
。很抱歉,如果你在wxPython 2.8.10.1上使用Ubuntu,这是真的。相反,它在windows上有效。在Ubuntu中,你可以在我的答案上使用第二种经过测试的策略。哦,天哪!我找到了我自己的答案!!!感谢我在过去花时间回答这些问题请不要将您的代码作为图像包含在内。请将您的答案作为图像包含在内。
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()
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)