TextCtrl在Python中没有正确对齐

时间:2016-07-06 08:04:03

标签: python wxpython

这是我的代码:

    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() 

给出了:

enter image description here

为什么textctrl与标签的距离不同?标签长度相同,textctrl应该" start"从他们的结局。 我该如何解决?

2 个答案:

答案 0 :(得分:1)

wxPython默认设置将使小部件符合其最佳尺寸。获取静态文本控件和文本控件对的最佳方法是通过其size参数将两个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(或其中一个变体),这将产生相同的效果。

答案 1 :(得分:1)

除了关于使其与BoxSizer一起使用的其他答案和评论之外,在我看来这个例子正在为网格大小调整而烦恼。由于网格的性质,它会自动对齐列,而不是需要程序员将框大小写入提交。以下是您使用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()