在我的python应用程序中,有一些对象显示在对象列表视图中。我想使用上下文菜单在列表中上下移动对象。
是否有任何方法可以识别鼠标右键单击所单击的对象(不一定是所选对象)?
import wx
from ObjectListView import (ObjectListView, ColumnDefn)
class MainFrame(wx.Frame):
MIN_SIZE = (500, 400)
def __init__(self, *args, **kwargs):
super(MainFrame, self).__init__(None, *args, **kwargs)
self.panel = MainPanel(self)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.panel)
self.SetSizer(sizer)
self.Center()
self.SetMinSize(self.MIN_SIZE)
self.Show()
widgets = [Widget('a'), Widget('b'),Widget('c')]
self.panel.olv_widgets.SetObjects(widgets)
def on_olv_widgets_right_down(self,event):
self.PopupMenu(UpDownMenu(self), event.GetPosition())
print(event.GetPosition())
def on_cell_select(self, event):
print('on_cell_select')
def move_item_down(self, event):
print('move_item_down')
def move_item_up(self, event):
print('move_item_up')
class MainPanel(wx.Panel):
LIST_SIZE = (2000, 2000)
def __init__(self, parent, *args, **kwargs):
super(MainPanel, self).__init__(parent, *args, **kwargs)
self.olv_widgets = ObjectListView(self, wx.ID_ANY,
style=wx.LC_REPORT|wx.SUNKEN_BORDER,
size=self.LIST_SIZE)
self.olv_widgets.SetColumns(
[ColumnDefn('Widget', 'left', parent.MIN_SIZE[0],
'description', isSpaceFilling=True)])
self.olv_widgets.Bind(wx.EVT_RIGHT_DOWN, parent.on_olv_widgets_right_down)
self.olv_widgets.Bind(wx.EVT_LIST_ITEM_SELECTED, parent.on_cell_select)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.olv_widgets, proportion=1, flag=wx.EXPAND)
self.SetSizer(sizer)
sizer.Fit(self)
class UpDownMenu(wx.Menu):
def __init__(self, parent):
super(UpDownMenu, self).__init__()
up_menu_item = wx.MenuItem(self, wx.NewId(), 'Move item up')
self.Append(up_menu_item)
self.Bind(wx.EVT_MENU, parent.move_item_up, up_menu_item)
down_menu_item = wx.MenuItem(self, wx.NewId(), 'Move item down')
self.Append(down_menu_item)
self.Bind(wx.EVT_MENU, parent.move_item_down, down_menu_item)
class Widget(object):
def __init__(self, description):
self.description = description
if __name__ == '__main__':
wx_app = wx.App()
MainFrame()
wx_app.MainLoop()
答案 0 :(得分:1)
您需要将ObjectListView
实例绑定到wx.EVT_LIST_ITEM_RIGHT_CLICK
。我对您的代码进行了一些重新整理,以举例说明:
import wx
from ObjectListView import ObjectListView, ColumnDefn
class MainFrame(wx.Frame):
MIN_SIZE = (500, 400)
def __init__(self, *args, **kwargs):
super(MainFrame, self).__init__(None, *args, **kwargs)
self.panel = MainPanel(self)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.panel)
self.SetSizer(sizer)
self.Center()
self.SetMinSize(self.MIN_SIZE)
self.Show()
widgets = [Widget('a'), Widget('b'),Widget('c')]
self.panel.olv_widgets.SetObjects(widgets)
def on_cell_select(self, event):
print('on_cell_select')
class MainPanel(wx.Panel):
LIST_SIZE = (2000, 2000)
def __init__(self, parent, *args, **kwargs):
super(MainPanel, self).__init__(parent, *args, **kwargs)
self.olv_widgets = ObjectListView(self, wx.ID_ANY,
style=wx.LC_REPORT|wx.SUNKEN_BORDER,
size=self.LIST_SIZE)
self.olv_widgets.SetColumns(
[ColumnDefn('Widget', 'left', parent.MIN_SIZE[0],
'description', isSpaceFilling=True)])
self.olv_widgets.Bind(wx.EVT_LIST_ITEM_RIGHT_CLICK, self.on_right_click)
self.olv_widgets.Bind(wx.EVT_LIST_ITEM_SELECTED, parent.on_cell_select)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.olv_widgets, proportion=1, flag=wx.EXPAND)
self.SetSizer(sizer)
sizer.Fit(self)
def on_right_click(self,event):
self.list_item_clicked = self.olv_widgets.GetSelectedObject()
print(self.list_item_clicked.description)
self.PopupMenu(UpDownMenu(self), self.olv_widgets.GetPosition())
def move_item_down(self, event):
print('move_item_down')
def move_item_up(self, event):
print('move_item_up')
class UpDownMenu(wx.Menu):
def __init__(self, parent):
super(UpDownMenu, self).__init__()
up_menu_item = wx.MenuItem(self, wx.NewId(), 'Move item up')
self.Append(up_menu_item)
self.Bind(wx.EVT_MENU, parent.move_item_up, up_menu_item)
down_menu_item = wx.MenuItem(self, wx.NewId(), 'Move item down')
self.Append(down_menu_item)
self.Bind(wx.EVT_MENU, parent.move_item_down, down_menu_item)
class Widget(object):
def __init__(self, description):
self.description = description
if __name__ == '__main__':
wx_app = wx.App()
MainFrame()
wx_app.MainLoop()