wx.ListCtrl: как выбрать строку в EVT_RIGHT_DOWN? - PullRequest
0 голосов
/ 08 августа 2011

Я пишу простой графический интерфейс базы данных с 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 голосов
/ 08 августа 2011

Я нашел решение, которое включает в себя оба возможных решения, которые я угадал.

Я отслеживаю текущую выбранную строку.Фрагмент говорит сам за себя:

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