wx.ListCtrl:如何在EVT_RIGHT_DOWN上选择一行?

时间:2011-08-08 11:35:35

标签: python wxpython wxwidgets

我正在用wxpython编写一个简单的数据库GUI。

为了显示我的数据库条目,我正在使用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,但我不知道如何(甚至是否)可以完成。
  3. 我是正确的吗?有没有更好的解决方案?

    提前致谢。

1 个答案:

答案 0 :(得分: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())