wxPython - 无法使 wx.StaticText 在 wx.StaticBoxSizer 内对齐

wxPython - Can't make wx.StaticText align inside a wx.StaticBoxSizer

进展如何?

我正在尝试将水平框内的两个 wx.StaticText 对齐,而水平框位于垂直 wx.StaticBoxSizer 内。你自己看。我想代码说明了我正在尝试做的事情。

谢谢!

import wx

class Frame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent)

        sizer = wx.StaticBoxSizer(wx.VERTICAL, self)
        left = wx.StaticText(self, -1, 'left', style=wx.ALIGN_LEFT)
        right = wx.StaticText(self, -1, 'right', style=wx.ALIGN_RIGHT)

        hBox = wx.BoxSizer(wx.HORIZONTAL)
        hBox.Add(left)
        hBox.Add(right)

        sizer.Add(hBox)
        self.SetSizerAndFit(sizer)

app = wx.App()
frame = Frame(None).Show()
app.MainLoop()

看来我必须指定一个 size 才能使对齐生效!

import wx

class Frame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent)

        sizer = wx.StaticBoxSizer(wx.VERTICAL, self)
        left = wx.StaticText(self, -1, 'left', size=(175, 15), style=wx.ALIGN_LEFT)
        right = wx.StaticText(self, -1, 'right', size=(25, 15))

        hBox = wx.BoxSizer(wx.HORIZONTAL)
        hBox.Add(left)
        hBox.Add(right)

        sizer.Add(hBox)
        self.SetSizerAndFit(sizer)

app = wx.App()
frame = Frame(None).Show()
app.MainLoop()

自从删除水平 boxsizers 中的 wx.ALIGN_LEFTwx.ALIGN_RIGHT 并引入:
wx._core.wxAssertionError: C++ assertion "!(flags & wxALIGN_RIGHT)" failed at /tmp/pip-install-8ko13ycp/wxpython/ext/wxWidgets/src/common/sizer.cpp(2168) in DoInsert(): Horizontal alignment flags are ignored in horizontal sizers,

这是个问题。

另一种选择是在左 and/or 右的 sizer 指令中使用 spacing。例如

import wx

class Frame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent)

        sizer = wx.StaticBoxSizer(wx.VERTICAL, self, "Test")
        left = wx.StaticText(self, -1, 'left')
        right = wx.StaticText(self, -1, 'right')

        hBox = wx.BoxSizer(wx.HORIZONTAL)
        hBox.Add(left, 0, wx.RIGHT, 100)
        hBox.Add(right, 0, wx.LEFT, 100)

        sizer.Add(hBox)
        self.SetSizerAndFit(sizer)

app = wx.App()
frame = Frame(None).Show()
app.MainLoop()