具有多个选择的wx.ListBox中的CTRL单击行为

时间:2011-07-12 15:36:02

标签: python wxpython

我有一个wx.ListBox,我希望用户可以选择,就好像他们按住CTRL键一样。所以 - 如果你点击一个未被选中的项目,它将被选中(不修改其他选择),如果你点击一个选定的项目,它将被取消选择(再次不修改其他选择)。

创建列表框的代码是:

    self.myListBox = wx.ListBox(self,
                                    -1,
                                    choices=self.keys,
                                    style =  wx.LB_HSCROLL
                                           | wx.LB_MULTIPLE
                                           | wx.LB_NEEDED_SB
                                           | wx.LB_SORT)
    self.Bind(wx.EVT_LISTBOX, self.OnSelection, self.myListBox)

问题/问题:

  • 有没有一种简单的方法可以做到这一点? wx.LB_MULTIPLEwx.LB_EXTENDED看起来可能就像我想要的那样,但我已经尝试过两者并且它似乎没有改变任何东西。文档中的描述也有点模糊 - 这两者之间究竟有什么区别?

  • 我知道可以使用event.GetSelection()获取所选项目的ID,但如果我尝试实现上述逻辑,即:

    if self.myListBox.IsSelected(idx):
        self.myListBox.Deselect(idx)
    else:
        self.myListBox.Select(idx)
    

    事件已经触发,所以它只是取消选择刚刚选择的内容。在此之前尝试调用event.Skip(),但也没有运气。有没有办法阻止它这样做?

  • 我注意到,当拖动鼠标进行多项选择时event.GetSelection()会得到正确的ID正在上升 - 即3, 2, 1, 0 - 但是向下看它只会显示第一个 - {{1 }}。我猜它只是打印出选择列表中的第一项 - 有没有办法从事件对象中获取列表(而不是调用0, 0, 0, 0)?

我正在运行Linux和wxPython版本2.6.4.0。

2 个答案:

答案 0 :(得分:1)

(迟到的答案,但它可能有用于记录。)
我最终为onClick事件编写处理程序:

def OnSelection(self, event):
    """Simulate CTRL-click"""
    selection = self.myListBox.GetSelections()

    for i in selection:
        if i not in self.selectedItems:
            # add to list of selected items
            self.selectedItems.append(i)
            self.myListBox.Select(i)
        elif len(selection) == 1:
            # remove from list of selected items
            self.selectedItems.remove(i)
            self.myListBox.Deselect(i)

    for i in self.selectedItems:
        # actually select all the items in the list
        self.myListBox.Select(i)

答案 1 :(得分:0)

wxPython 2.6.x超级老了。升级到2.8或2.9系列。我刚刚运行了2.8.11的wxPython演示,它似乎在Windows上运行正常。