Привязать событие к wx.Menu() вместо пункта меню в wxPython

Моя проблема может быть легко определена с помощью следующего кода:

self.Bind(wx.EVT_MENU_OPEN, self.OnAbout)

Это будет означать, что когда я нажимаю на любой элемент wx.Menu() в MenuBar, вызывается функция onAbout(). Как привязать это событие к определенному wx.Menu(), который называется wx.MenuAbout()?

Если вы чувствуете себя очень полезным, возможно, вы могли бы предоставить мне ссылку на документацию по обработчикам событий. Я смог найти документацию для функции обработчика событий, но не для самих обработчиков событий (таких как wx.EVT_MENU).

Аналогичный вопрос, но я не собираюсь привязывать диапазон wx.Menu() к событию: Можно ли привязать событие к меню вместо пункта меню в wxPython?

Изменить: в идеале это то, что я хотел бы сделать:

menuAbout = wx.Menu()
self.Bind(wx.EVT_MENU, self.OnAbout, id=menuAbout.GetId())

В результате любые другие элементы в .menuBar() (такие как: Файл, Правка, Инструменты) будут работать как обычные меню, но «О программе» работает как интерактивная ссылка.

Использование wx.EVT_MENU_OPEN означает, что меню «Файл» может быть открыто, а затем, когда указатель мыши наводится на «о», вызывается функция self.OnAbout, которая, как я понимаю, происходит только тогда, когда пользователь нажимает конкретно на меню «О программе».


person Peter Horne    schedule 27.07.2009    source источник


Ответы (2)


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

EVT_MENU_OPEN сработает, как только откроется любое меню. При этом, если это то, что вы действительно хотите, вы всегда можете сделать это:

Где вы определяете свое меню:

self.about_menu = wx.Menu()  # or whatever inherited class you have
self.Bind(wx.EVT_MENU_OPEN, self.on_menu_open)

Затем ваш обратный вызов:

def on_menu_open(self, event):
    if event.GetMenu()==self.about_menu:
         #do something
person Mathieu    schedule 28.07.2009
comment
Спасибо за ваш ответ. К сожалению, я изо всех сил пытаюсь привязать его к событию, используя EVT_MENU. Я не знаю, как найти идентификатор для wx.Menu(), и поэтому следующее не работает: menuAbout = wx.Menu() self.Bind(wx.EVT_MENU, self.OnAbout, id=menuAbout.GetId() ) - person Peter Horne; 28.07.2009

Это работает для меня:

class myFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "my frame")

        #give the Frame a menu bar
        self.frame_menubar = wx.MenuBar()

        fileMenu = wx.Menu()
        self.frame_menubar.Append(fileMenu, "File")

        self.rotMenu = wx.Menu()
        self.frame_menubar.Append(self.rotMenu, "Rotate")

        self.SetMenuBar(self.frame_menubar)

        self.Bind(wx.EVT_MENU_OPEN, self.rot)

    def rot(self, event):
        if event.GetMenu() == self.rotMenu:
            print 'rotate clicked'
person nmz787    schedule 02.12.2014