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()で最小サイズをわざわざ宣言してるのに無視される。さてどうしたものか。