在sizer中显示水平复选框

时间:2013-10-20 16:06:41

标签: wxpython

我正在尝试一种水平显示复选框的方法。 也许有一种在sizer中使用定位的方法。

□一个□两个□三个

import wx

class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,None,wx.ID_ANY,title='test chkBx')        

        self.hbox = wx.BoxSizer()
        self.vbox= wx.BoxSizer(wx.VERTICAL)
        self.background = wx.Panel(self)

        choices = ['one', 'two', 'three']

        self.chkBx = wx.CheckListBox(self, choices=choices)       
        self.bottomview = wx.TextCtrl(self,
                                     style=wx.TE_MULTILINE|wx.TE_RICH|wx.BORDER_SIMPLE)        

        hsizer1 = wx.BoxSizer(wx.HORIZONTAL)
        hsizer1.Add(self.chkBx,1,flag=wx.ALIGN_RIGHT|wx.RIGHT|wx.EXPAND) 

        hsizer2 = wx.BoxSizer(wx.HORIZONTAL)
        hsizer2.Add(self.bottomview,1,flag = wx.EXPAND)        

        self.vbox.Add(hsizer1,proportion = 2,flag = wx.EXPAND)
        self.vbox.Add(hsizer2,proportion = 8,flag = wx.EXPAND)

        self.SetSizer(self.vbox)
        self.Show()

app = wx.App(redirect=False)
frame = MainFrame()
app.MainLoop()

这将具有我想要的外观。但是我的选择清单只有“三个”。

choices = ['one']
self.chkBx1 = wx.CheckListBox(self, choices=choices)
choices = ['two']
self.chkBx2 = wx.CheckListBox(self, choices=choices)
choices = ['three']
self.chkBx3 = wx.CheckListBox(self, choices=choices)
self.bottomview = wx.TextCtrl(self,
                             style=wx.TE_MULTILINE|wx.TE_RICH|wx.BORDER_SIMPLE)        

hsizer1 = wx.BoxSizer(wx.HORIZONTAL)
hsizer1.Add(self.chkBx1,1,flag=wx.ALIGN_RIGHT|wx.RIGHT|wx.EXPAND)
hsizer1.Add(self.chkBx2,1,flag=wx.ALIGN_RIGHT|wx.RIGHT|wx.EXPAND)
hsizer1.Add(self.chkBx3,1,flag=wx.ALIGN_RIGHT|wx.RIGHT|wx.EXPAND)

1 个答案:

答案 0 :(得分:0)

我认为你不能使用CheckListBox。但是,您可以手动执行此操作。您必须自己创建复选框。如果您使用的是wxpython 2.9,则可以使用WrapSizer获得多行支持,否则对于单行,BoxSizer工作正常。这不是一个完全有效的例子,但它是我写的东西的实际代码,所以基本代码应该有效。 self._outsizer是窗口大小调整器,而fieldenum是键的值和值的键的双向字典(因此检查字符串,您可能不需要)。 self.field *都是字典:

fieldenum = fielddata.mnemonics
self.fieldenums[fieldname] = fieldenum
self.fieldenumsizers[fieldname] = _wx.WrapSizer(_wx.HORIZONTAL)
fes = self.fieldenumsizers[fieldname]
self.fieldenumwindows[fieldname] = []
for fe in [x for x in fieldenum if isinstance(x, basestring)]:
    self.fieldenumwindows[fieldname].append(_wx.CheckBox(self, -1, label=fe))
    fes.Add(self.fieldenumwindows[fieldname][-1])
fes.Layout()
self.outsizer.Add(fes, 0, _wx.EXPAND)

如果你不希望超过一行,你应该在HORIZONTAL模式下使用常规的BoxSizer,因为WrapSizer在复杂的设置中工作可能很棘手(我认为我的情况是我想要水平移动一个按钮,然后是复选框的包装列表,然后是另一个复选框,然后是一个按钮,然后是一个textctrl。在这种情况下,因为父sizer和包装sizer都是水平的,所以它会混淆。解决方案:将WrapSizer包装在一个垂直BoxSizer,然后将其包含在水平BoxSizer中,看起来有效。)