2012-12-03 3 views
0

일부 컨트롤러가 주 메뉴 모음의 레이아웃을 변경할 수있는 응용 프로그램이 있습니다. 메인 메뉴 바를 컨트롤러에 넘겨줌으로써 컨트롤러가 컨트롤러에 메뉴를 추가합니다. 내 문제는 메뉴 추가 이벤트에 대한 바인딩 이벤트입니다.Windows의 wx.Menu에 이벤트를 직접 바인딩 할 수없는 이유는 무엇입니까?

def bind_main_menu_bar(self, main_menu_bar): 
    self.main_menu_bar = main_menu_bar 

    edit_menu = shared.create_menu([ 
     (const.ID_UNDO, self.LABEL_UNDO_EMPTY), 
     (const.ID_REDO, self.LABEL_REDO_EMPTY), 
     (), 
     (const.ID_VALIDATE_ADDRESSES, 'Validate selected addresses'), 
     (const.ID_VALIDATE_ALL_ADDRESSES, 'Validate all addresses'), 
    ]) 
    edit_menu.Bind(wx.EVT_MENU, self.on_menu) 
    edit_menu.Bind(wx.EVT_UPDATE_UI, self.on_menu_update) 

    main_menu_bar.Insert(1, edit_menu, 'Edit') 

이 OSX에서 훌륭하게 작동하지만 edit_menu 메뉴로 직접 이벤트를 바인딩 할 때 Windows에서 만 wx.EVT_MENU 이벤트가 작동 : 그것은 이론적으로 매우 간단합니다. 즉, wx.EVT_UPDATE_UI 이벤트 핸들러가 실행되지 않습니다. 또한 EVT_MENU_OPEN, EVT_MENU_CLOSEEVT_MENU_HIGHLIGHT과 같은 바인딩을 시도했지만 그 중 아무 것도 작동하지 않습니다. 최상위 수준 프레임에 바인딩 할 때 모두 작동하지만 이벤트 처리기를 edit_menu 메뉴로만 제한 할 수는 없습니다.

이 버그입니까? 아니면 내가 간과하는 것이 있습니까? 또한, 누구든지 내 문제에 대한 해결책을 찾을 수 있습니까?


나는 윈도우 8

+0

무엇이'shared.create_menu'입니까? 코드를 공유하거나 참조하고있는 내장 함수를 명확히 할 수 있습니까? –

답변

4

마이크의 권한이므로 명시적인 ID는 사용하지 않아도됩니다. 자세한 내용은 wxPython Style guide in the wiki을 참조하십시오.

메뉴 항목은 일반 Windows가 아니므로 일반 이벤트 바인딩 작업을 수행 할 수 없습니다. 너무 나쁩니다.

그러나 이벤트를 프레임에 바인딩 할 때 이벤트의 출처를 지정할 수 있습니다. 바인딩 메뉴 이벤트에 대한 나의 일반적인 관용구 :이 경우

FileMenu = wx.Menu() 
item = FileMenu.Append(wx.ID_EXIT, "&Quit") 
self.Bind(wx.EVT_MENU, self.OnQuit, item) 

selfFrame입니다 - 그래서 당신은 말 : 프레임에 EVT_MENU을 결합하는 콜백으로 self.OnQuit를 호출하지만이 이벤트를 바인딩 특정 메뉴 항목.

동적 바인딩을 수행 할 때 이것은 더 못생긴 일이지만 작동해야합니다. 이 예에서 내가 ID 사용하고 있음을

주 - 그 규칙에 예외는 같은 (다음 wx 다양한 플랫폼에서 "옳은 일을"할 수 있기 때문에 (같은 wx.ID-EXIT, wx.ID_HELP) 표준 ID를 사용하는 것은 좋은 점이다 OS-X의 앱 메뉴에 대한 꽤 많은 메뉴).

+0

+1 각 메뉴 항목에 별도의 처리기를 묶는 것을 진지하게 생각하지는 않았다. 그것은 비록 최고의 솔루션이 될 것 같아 보인다. 그냥 메뉴 항목을위한 작은 3 줄 방법의 톤을 만드는 것은 너무 낭비입니다. 나도 이벤트 소스로'wx.Menu'를 지정할 수 없습니다. – Hubro

1

에 wxPython을 2.9 (DEV)를 사용하고 난 당신이 프레임이 아니라 메뉴 항목 자체에 메뉴 이벤트를 바인딩되어 있다는 것을 확신합니다. 그것을 시도하고 그것이 작동하는지보십시오.

+0

네, 제 질문에서 말했듯이 : "최상위 프레임에 바인딩 할 때 모두 작동하지만, 이벤트 핸들러를'edit_menu' 메뉴로만 제한 할 방법이 없습니다." 내가 메뉴 버튼 ID가 핸들러 사이에 충돌하지 않도록 조심해야하기 때문에 이벤트를 직접 편집 메뉴에 바인딩하는 것이 훨씬 쉽고 간단하다. 편집 메뉴를 다시 제거 할 때 바인딩하는 모든 이벤트의 바인딩을 해제하는 것을 기억하십시오. – Hubro

+0

wx에서 하드 코딩 된 ID를 사용하면 안됩니다. wx.NewId 또는 wx.ID_ANY 사용 –

+0

모든 ID에 대해'wx.NewId'를 사용하고 있지만 항목이 충분한 메뉴를 제공합니다. 편집기의 메뉴에서 항목의 ID를 쉽게 상상할 수 있습니다. 기본 메뉴의 항목. 나는 ID_UNDO'와'ID_VALIDATE_ADDRESSES' 등과 같은 ID 이름을 사용하고 있는데, 아이템마다 새로운 ID를 생성하지 않습니다. – Hubro

관련 문제