【问题标题】:CTRL-click behavior in wx.ListBox with multiple selections具有多个选择的 wx.ListBox 中的 CTRL-单击行为
【发布时间】:2011-07-12 15:36:01
【问题描述】:

我有一个 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 - 但向下它只会显示第一个 - 0, 0, 0, 0。我猜它只是打印出选择列表中的第一项——有没有办法从事件对象中获取列表(而不是调用self.myListBox.GetSelections())?

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

【问题讨论】:

    标签: python wxpython


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

      wxPython 2.6.x 超级旧。升级到 2.8 或 2.9 系列。我刚刚为 2.8.11 运行了 wxPython 演示,它似乎在 Windows 上对我来说运行良好。

      【讨论】:

      • 是的,我知道它已经过时了,但目前升级不是这个项目的选项。另外 - 你能定义“工作正常”是什么意思吗? 2.8.11 中有请求的行为吗?
      • 我可以CTRL+点击来切换选择
      • 是的,这也适用于我。抱歉,我想我不清楚 - 我想要做的是模拟那种行为没有用户实际按下 CTRL 键。
      • 你可能需要创建一个自定义控件。我认为本机控件不支持该功能。
      猜你喜欢
      • 2013-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 2012-04-10
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      相关资源
      最近更新 更多