我有一个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_MULTIPLE
或wx.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。
答案 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上运行正常。