2011-08-08 19 views
0

我正在用wxpython寫一個簡單的數據庫GUI。wx.ListCtrl:如何在EVT_RIGHT_DOWN上選擇一行?

爲了顯示我的數據庫條目,我正在使用wx.ListCtrl。我們來考慮下面的代碼片段:

class BookList(wx.ListCtrl): 
    def __init__(self, parent, ID=wx.ID_ANY): 
    wx.ListCtrl.__init__(self, parent, ID) 

    self.InsertColumn(0, 'Title') 
    self.InsertColumn(1, 'Author') 

    # set column width ... 

    self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown) 


    def OnRightDown(self, event): 
    menu = wx.Menu() 
    delete = menu.Append(wx.ID_ANY, 'Delete Item') 

    self.Bind(wx.EVT_MENU, self.OnDelete, delete) 

    # select row 

    self.PopupMenu(menu, event.GetPosition()) 

我不知道如何在產卵菜單之前選擇行。

我想到了兩個可能的解決方案:

  1. 使用wx.ListCtrl.Select(),但我不知道如何獲得對應於我要選擇行idx參數。
  2. 觸發器wx.EVT_LEFT_DOWN,但我不知道如何(甚至如果)它可以完成。

我在正確的方式嗎?有沒有更好的解決方案?

在此先感謝。

回答

0

我發現了一個解決方案,涉及到兩種我猜測的可能解決方案。

我已跟蹤當前選定的行。摘錄本身:

class BookList(wx.ListCtrl): 
    def __init__(self, parent, ID=wx.ID_ANY): 
    wx.ListCtrl.__init__(self, parent, ID) 

    self.InsertColumn(0, 'Title') 
    self.InsertColumn(1, 'Author') 

    # set column width ... 

    self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) 
    self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown) 

    # currently selected row 
    self.cur = None 


    def OnLeftDown(self, event): 
    if self.cur != None: 
     self.Select(self.cur, 0) # deselect currently selected item 

    x,y = event.GetPosition() 
    row,flags = self.HitTest((x,y)) 

    self.Select(row) 
    self.cur = row 


    def OnRightDown(self, event): 
    menu = wx.Menu() 
    delete = menu.Append(wx.ID_ANY, 'Delete Item') 

    self.Bind(wx.EVT_MENU, self.OnDelete, delete) 

    # select row 
    self.OnLeftDown(event) 

    self.PopupMenu(menu, event.GetPosition())