wxPythonに苦戦

CheckListBoxがうまく扱えない。SizerにいれてLayout()とすると縦方向のサイズが0になってしまい以降のコントロールの配置がおかしくなる。
具体的には以下のコードで狙ったとおりの配置ができない。

class AllMovePanel(wx.Panel):
    u"""全体移動用のパネル"""
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1)
        self.__CreateWidget()

    def __CreateWidget(self):
        s1 = wx.BoxSizer(wx.VERTICAL)
        self.__CreateIODirBox(self, s1)
        self.__CreateFileSelectionBox(self, s1)
        self.__CreateOptionBox(self, s1)
        self.__CreateCordinateBox(self, s1)
        b3 = wx.Button(self, wx.ID_APPLY, u"実行")
        s1.Add(b3, 0, wx.ALL | wx.EXPAND, 5)
        self.SetSizer(s1)
        self.Layout()

    def __CreateIODirBox(self, parent, sizer):
        sb = wx.StaticBox(parent, -1, u"入力ディレクトリ")
        sbs = wx.StaticBoxSizer(sb, wx.HORIZONTAL)
        t1 = wx.TextCtrl(parent, -1)
        b1 = wx.Button(parent, -1, "...", name="in")
        sbs.Add(t1, 1, wx.EXPAND | wx.GROW | wx.ALL, 5)
        sbs.Add(b1, 0, wx.ALL | wx.STRETCH_NOT, 5)
        sizer.Add(sbs, 0, wx.EXPAND)
        parent.Bind(wx.EVT_BUTTON, self.OnDirButtonPress, b1)
        self.InDirTextCtrl = t1

        sb = wx.StaticBox(parent, -1, u"出力ディレクトリ")
        sbs = wx.StaticBoxSizer(sb, wx.VERTICAL)
        s = wx.BoxSizer(wx.HORIZONTAL)
        t2 = wx.TextCtrl(parent, -1)
        b2 = wx.Button(parent, -1, "...", name="out")
        s.Add(t2, 1, wx.EXPAND | wx.GROW | wx.ALL, 5)
        s.Add(b2, 0, wx.ALL | wx.STRETCH_NOT, 5)
        sbs.Add(s, 0, wx.EXPAND)
        cb = wx.CheckBox(parent, -1, u"入力と同一")
        sbs.Add(cb, 0, wx.ALL, 5)
        sizer.Add(sbs, 0, wx.EXPAND)
        parent.Bind(wx.EVT_BUTTON, self.OnDirButtonPress, b2)
        self.OutDirTextCtrl = t2
        self.IsSameInDir = cb
        parent.Bind(wx.EVT_CHECKBOX, self.OnCheckIsSameInDir, cb)

    def __CreateFileSelectionBox(self, parent, sizer):
        sb = wx.StaticBox(parent, -1, u"対象ファイル")
        sbs = wx.StaticBoxSizer(sb, wx.VERTICAL)
        clb1 = wx.CheckListBox(parent, -1,
            style=wx.LB_EXTENDED | wx.LB_HSCROLL)
        a = sbs.Add(clb1, 1, wx.EXPAND | wx.GROW | wx.ALL, 5)
        a.SetMinSize((10, 10))
        s = wx.BoxSizer(wx.HORIZONTAL)
        b_all = wx.Button(parent, wx.ID_SELECTALL, u"全て")
        b_clear = wx.Button(parent, wx.ID_CLEAR, u"クリア")
        s.Add(b_all, 0, wx.ALL | wx.EXPAND, 5)
        s.Add(b_clear, 0, wx.ALL | wx.EXPAND, 5)
        sbs.Add(s, 0, wx.EXPAND)
        sizer.Add(sbs, 1, wx.EXPAND | wx.ALL, 5)
        sbs.SetMinSize((10, 10))
        self.FileSelectionList = clb1
        parent.Bind(wx.EVT_BUTTON, self.OnAllButtonPress, b_all)
        parent.Bind(wx.EVT_BUTTON, self.OnClearButtonPress, b_clear)

    def __CreateOptionBox(self, parent, sizer):
        sb = wx.StaticBox(parent, -1, u"設定")
        sbs = wx.StaticBoxSizer(sb, wx.HORIZONTAL)
        cb1 = wx.CheckBox(parent, -1, u"側(Y=Z)")
        sbs.Add(cb1, 0, wx.ALL, 5)
        cb2 = wx.CheckBox(parent, -1, u"退避位置も移動")
        sbs.Add(cb2, 0, wx.ALL, 5)
        sizer.Add(sbs, 0, wx.EXPAND | wx.ALL, 5)
        self.IsOneSide = cb1
        self.MoveEvacPoint = cb2
        parent.Bind(wx.EVT_CHECKBOX, self.OnCheckIsOneSide, cb1)

    def __CreateCordinateBox(self, parent, sizer):
        sb = wx.StaticBox(parent, -1, u"移動量")
        sbs = wx.StaticBoxSizer(sb, wx.HORIZONTAL)
        s1_4 = wx.BoxSizer(wx.VERTICAL)
        l4 = wx.StaticText(parent, -1, "x")
        s1_4.Add(l4, 0, wx.ALL, 5)
        t3 = wx.TextCtrl(parent, -1)
        s1_4.Add(t3, 1, wx.EXPAND | wx.GROW | wx.ALL, 5)
        sbs.Add(s1_4, 0, wx.EXPAND)
        s1_5 = wx.BoxSizer(wx.VERTICAL)
        l5 = wx.StaticText(parent, -1, "y")
        s1_5.Add(l5, 0, wx.ALL, 5)
        t4 = wx.TextCtrl(parent, -1)
        s1_5.Add(t4, 1, wx.EXPAND | wx.GROW | wx.ALL, 5)
        sbs.Add(s1_5, 0, wx.EXPAND)
        s1_6 = wx.BoxSizer(wx.VERTICAL)
        l6 = wx.StaticText(parent, -1, "z")
        s1_6.Add(l6, 0, wx.ALL, 5)
        t5 = wx.TextCtrl(parent, -1)
        s1_6.Add(t5, 1, wx.EXPAND | wx.GROW | wx.ALL, 5)
        sbs.Add(s1_6, 0, wx.EXPAND)
        sizer.Add(sbs, 0, wx.EXPAND | wx.ALL, 5)
        self.X = t3
        self.Y = t4
        self.Z = t5

    def OnAllButtonPress(self, evt):
        for i in range(self.FileSelectionList.GetCount()):
            self.FileSelectionList.Check(i, True)

    def OnClearButtonPress(self, evt):
        for i in range(self.FileSelectionList.GetCount()):
            self.FileSelectionList.Check(i, False)

    def OnDirButtonPress(self, evt):
        dlg = wx.DirDialog(self)
        dir = None
        if evt.GetEventObject().GetName() == "in":
            dir = self.InDirTextCtrl.GetValue()
        elif evt.GetEventObject().GetName() == "out":
            dir = self.OutDirTextCtrl.GetValue()
        if dir:
            dlg.SetPath = dir
        try:
            if dlg.ShowModal() == wx.ID_OK:
                dir = dlg.GetPath()
        finally:
            dlg.Destroy()
        if evt.GetEventObject().GetName() == "in":
            self.InDirTextCtrl.SetValue(dir)
            self.UpdateFileList(None)
            self.OnCheckIsSameInDir(None)
        elif evt.GetEventObject().GetName() == "out":
            self.OutDirTextCtrl.SetValue(dir)

    def UpdateFileList(self, evt):
        list = os.listdir(self.InDirTextCtrl.GetValue())
        self.FileSelectionList.Set(list)

    def OnApplyButtonPress(self, evt):
        if self.IsOneSide.IsChecked():
            move = (float(self.X.GetValue()),
                float(self.Y.GetValue()),
                float(self.Y.GetValue()))
        else:
            move = (float(self.X.GetValue()),
                float(self.Y.GetValue()),
                float(self.Z.GetValue()))

        for i in range(self.FileSelectionList.GetCount()):
            if self.FileSelectionList.IsCheckd(i):
                fname = self.FileSelectionList.GetItemText(i)
                infile = "\\".join([self.InDirTextCtrl.GetValue(), fname])
                outfile = "\\".join([self.OutDirTextCtrl.GetValue(), fname])

    def OnCheckIsOneSide(self, evt):
        if self.IsOneSide.IsChecked():
            self.Z.Disable()
        else:
            self.Z.Enable()

    def OnCheckIsSameInDir(self, evt):
        if self.IsSameInDir.IsChecked():
            self.OutDirTextCtrl.Disable()
            self.OutDirTextCtrl.SetValue(self.InDirTextCtrl.GetValue())
        else:
            self.OutDirTextCtrl.SetValue(self.InDirTextCtrl.GetValue())
            self.OutDirTextCtrl.Enable()

SetMinSize()で最小サイズをわざわざ宣言してるのに無視される。さてどうしたものか。