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

0 投票
1 回答
1996 浏览
提问于 2025-04-16 23:07

我正在用wxpython写一个简单的数据库图形界面。

为了显示我的数据库条目,我使用了一个叫做 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 事件,但我不知道怎么做(甚至不知道是否可以这样做)。

我这样做对吗?有没有更好的解决办法?

提前谢谢大家。

1 个回答

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

撰写回答