Python 中的 TextCtrl 未正确对齐

TextCtrl aren't aligning correctly in Python

这是我的代码:

    label_1 = wx.StaticText(self,-1,_("xxxxxxxxxxxxxxxxx"))
    label_2 = wx.StaticText(self,-1,_("xxxxxxx:         "))
    self.item1= wx.TextCtrl(self,-1,"",style=wx.TE_PROCESS_ENTER)
    self.item2= wx.TextCtrl(self, -1, "", style=wx.TE_PROCESS_ENTER)
    self.item1.SetMinSize((200,-1))
    self.item2.SetMinSize((200,-1))
    sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
    sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
    sizer_1.Add(label_1,0,wx.RIGHT|wx.ALIGN_CENTER_VERTICAL,10)
    sizer_1.Add(self.item1,0,wx.ALIGN_CENTER_VERTICAL)
    sizer_2.Add(label_2,0,wx.RIGHT|wx.ALIGN_CENTER_VERTICAL,10)
    sizer_2.Add(self.item2,0,wx.ALIGN_CENTER_VERTICAL) 
    sizer = wx.BoxSizer(wx.VERTICAL)
    sizer = wx.BoxSizer(wx.VERTICAL)
    sizer.Add(sizer_1,0,wx.ALL,4)  
    sizer.Add(sizer_2,0,wx.ALL,4) 
    self.SetSizer(sizer)
    self.Layout() 

给出:

为什么 textctrl 与标签的距离不同?标签具有相同的长度,textctrl 应该从它们的末尾“开始”。 我该如何解决?

wxPython 默认值将使小部件适合其最佳大小。使成对的静态文本控件和文本控件对齐的最佳方法是通过它们的大小参数将两个 StaticText 小部件设置为特定大小。这样的东西应该足够了:

size = (150, -1)
label_1 = wx.StaticText(self,-1, label="xxxxxxxxxxxxxxxxx", size=size)
label_2 = wx.StaticText(self,-1, label="xxxxxxx:", size=size)

如您所见,这也消除了向第二个标签的字符串添加填充的需要。

或者,您可以使用 GridSizer(或其变体之一),效果相同。

除了关于使其与 BoxSizer 一起工作的其他答案和评论外,在我看来,这个示例迫切需要一个网格大小调整器。由于网格的性质,它会自动对齐列,而不是需要程序员将 box sizer 敲入提交。这是移植到使用 wx.FlexGridSizer:

的示例
import wx

class Panel(wx.Panel):
    def __init__(self, *args, **kw):
        super(Panel, self).__init__(*args, **kw)

        # Create widgets
        label_1 = wx.StaticText(self, -1, "xxxxxxxxxxxxxxxxx:")
        label_2 = wx.StaticText(self, -1, "xxxxxxx:")
        self.item1 = wx.TextCtrl(self, -1, "", size=(200,-1), style=wx.TE_PROCESS_ENTER)
        self.item2 = wx.TextCtrl(self, -1, "", size=(200,-1), style=wx.TE_PROCESS_ENTER)

        # put them into a grid sizer
        fgs = wx.FlexGridSizer(2,2, 10,10)
        fgs.Add(label_1, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL)
        fgs.Add(self.item1)
        fgs.Add(label_2, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL)
        fgs.Add(self.item2)

        # put a margin around the whole thing
        sizer = wx.BoxSizer()
        sizer.Add(fgs, 1, wx.EXPAND|wx.ALL, 10)

        self.SetSizer(sizer)
        self.Layout() 

app = wx.App()
frm = wx.Frame(None, title="foobar")
pnl = Panel(frm)
frm.Show()
app.MainLoop()