0

我试图找出一种水平显示复选框的方法。也许有一种在 sizers 内使用定位的方法。

□一□二□三

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

1 回答 1

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)

如果您不希望超过单行,则应该在水平模式下使用常规 BoxSizer,因为 WrapSizer 在复杂的设置中工作可能会很棘手(我认为我的情况是我想水平放置一个按钮,然后是复选框的包装列表,然后是另一个复选框,然后是按钮,然后是 textctrl。在这种情况下,因为父尺寸器和包装尺寸器都是水平的,所以会混淆。解决方案:将 WrapSizer 包装在垂直的 BoxSizer 中,然后然后将其包含在水平 BoxSizer 中,这似乎可行)。

于 2013-10-21T14:21:39.660 回答