Есть ли способ получить объект, выбранный в представлении списка объектов? - PullRequest
1 голос
/ 02 июня 2019

В моем приложении на 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()

1 Ответ

1 голос
/ 04 июня 2019

Вам необходимо привязать экземпляр 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...