2011-07-12 90 views
1

我有一個wx.ListBox,我希望用戶從中選擇,就好像他們按住CTRL鍵一樣。所以 - 如果你點擊一個沒有被選擇的項目,它將被選中(不需要修改其他選擇),並且如果你點擊一個選定的項目,它將被取消選擇(同樣沒有修改其他選擇)。在多個選擇的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。

回答

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

wxPython 2.6.x超級老。升級到2.8或2.9系列。我剛剛運行了2.8.11版的wxPython演示程序,它在Windows上似乎很適合我。

+0

是的,我知道這是舊的,但升級是不是一種選擇這個項目目前。另外 - 你能否定義「正常工作」的含義?在2.8.11中有請求的行爲嗎? – whrrgarbl

+0

我可以按CTRL +點擊切換選擇 –

+0

是的,這也適用於我。對不起,我想我並不清楚 - 我想要做的就是模擬那種行爲,而不是用戶實際上按下CTRL鍵。 – whrrgarbl