为什么我的wxPython文本对齐不正确?

6 投票
3 回答
14847 浏览
提问于 2025-04-17 08:58

我正在用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 个回答

-1

我昨天也遇到了同样的问题,我用的是MAC OS X和wxpython 4.0.6。

最后我发现这个脚本对我有效。

我还意识到,如果你最后不设置Sizer,静态文本就不会居中对齐。

我的代码

1

我觉得文本没有对齐是因为没有设置大小。你可以试试:

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),这意味着只够让文本显示出来,而在这个框里对齐就不会有明显的效果。

不过,这并不总是有效

13

编辑:虽然下面评论的内容在Windows上都能正常工作,但第一个选项在Ubuntu上可能会因为某个bug而无法使用。评论中提到的一个之前的帖子也表明,OSX上也会出现同样的问题。
无论如何,第二个选项使用垂直布局在Ubuntu和Windows上都能正常工作,所以你可以在OSX上试试。


你的文本中有指令可以用来对齐,实际上它是对齐的。但是,StaticText的大小并不是面板的大小,而只是文本的大小。由于它的位置被限制在自己的大小内,所以你看不到对齐模式之间的区别。

你有两个选项来解决这个问题:

选项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. 将控件放置在布局管理器中可用空间的期望位置。
你可以使用StaticTextposition参数来实现这一点。但这会有和使用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()

这个选项涉及到面板和布局管理器的组合,生成的代码比第一个选项的代码更难以简化。

撰写回答