python: щелкните правой кнопкой мыши в меню списка, не отображая выбранный элемент

В моих постоянных усилиях узнать больше о python я пытаюсь добавить событие щелчка правой кнопкой мыши в свою программу управления mp3. Что в настоящее время работает, так это то, что он показывает меню и все параметры. Что не работает, так это то, что функции, выбранные из меню, не выполняются, как я думаю, должны быть. Большая часть этого кода была взята из инструкции на другом сайте.

Вот параметры меню правой кнопки мыши

menu_titles = ["Remove Selection from list",
               "Delete Selection from system",
               "Move Selection",
               "Copy Selection",
               "Print Selection"]

menu_title_by_id = {}
for title in menu_titles:
    menu_title_by_id[ wxNewId() ] = title

Код, который запускается, когда происходит событие правого клика

def RightClickCb( self, event ):
    # record what was clicked
    self.list_item_clicked = right_click_context = event.GetText()

    ### 2. Launcher creates wxMenu. ###
    menu = wxMenu()
    for (id,title) in menu_title_by_id.items():
        ### 3. Launcher packs menu with Append. ###
        menu.Append( id, title )
        ### 4. Launcher registers menu handlers with EVT_MENU, on the menu. ###
        EVT_MENU( menu, id, self.MenuSelectionCb )

    ### 5. Launcher displays menu with call to PopupMenu, invoked on the source component, passing event's GetPoint. ###
    self.MainPanel.PopupMenu( menu, event.GetPoint() )
    menu.Destroy() # destroy to avoid mem leak

def MenuSelectionCb( self, event ):
    # do something
    operation = menu_title_by_id[ event.GetId() ]
    target    = self.list_item_clicked
    print 'Perform "%(operation)s" on "%(target)s."' % vars()

То, что я ожидаю получить, когда я щелкаю правой кнопкой мыши, а затем выбираю один из параметров в меню, - это вывод

Perform "Print Selection" on "<data about the selection here>"

Я получаю

Perform "Print Selection" on "."

Как мне получить данные из элемента, который я выбрал как часть события правого клика?


person ccwhite1    schedule 28.03.2011    source источник


Ответы (2)


Возможно, вам следует использовать event.GetString() вместо event.GetText()

См. здесь

Ваш код кажется устаревшим, хотя привязку к событиям следует выполнять следующим образом:

menu.Bind(wx.EVT_MENU, self.MenuSelectionCb, id=id)

более того, если вы привязываете все идентификаторы к одной и той же функции, вы можете просто привязать один раз для всех идентификаторов:

menu.Bind(wx.EVT_MENU, self.MenuSelectionCb)
person neurino    schedule 28.03.2011
comment
Хм, выбранный элемент — это объект, являющийся частью списка, а не отдельной строки. Как бы вы это передали? - person ccwhite1; 28.03.2011
comment
@ccwhite1: MenuItems не допускает связи с данными клиента ( как ListBox), поэтому я предлагаю вам продолжать используя словари, используя идентификатор MenuItem в качестве ключа и ваш объект в качестве значения, чтобы вы могли получить его, например, self.my_data_dict[event.GetId()] - person neurino; 29.03.2011

Вы можете найти решение в разделе Python: щелкните правой кнопкой мыши на objectlistview не показывает выбранное имя элемента, где вместо этого предлагается использовать метод GetSelectedObject() из objectlistview.

person Cedric Zoppolo    schedule 13.04.2016