wx.ListCtrl:如何在EVT_RIGHT_DOWN时选择行?
我正在用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())
我不知道怎么在弹出菜单之前选择行。
我想到了两个可能的解决办法:
- 使用
wx.ListCtrl.Select()
,但我不知道怎么获取要选择的行对应的idx
参数。 - 触发
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())