2011-11-08 3 views
0

저는 아치 리눅스 x86_64에서 파이썬 2.7.2와 wxPython 2.8.12.1을 사용하고 있습니다.wxPython : 메뉴 키 단축키와 동적 인 비활성화의 범위

나는 다음과 같은 예를이 방식으로 작동하고 싶습니다 :
* Shift+A을 누르면, 포커스가 (text_A) TextCtrl 왼쪽 때 do_A()을 실행해야하고, Shift+B를 눌러이 텍스트 영역에 B를 작성해야; 또한, 오른쪽 TextCtrl (text_B)에 포커스가있을 때
는 * Shift+A를 눌러 그것이 텍스트 영역 A를 작성해야하고, Shift+B를 눌러 그것이 do_B() 실행한다 menu.foo.bar_B 사용 중지되어야한다 (그리고 menu.foo.bar_A 가능); 또한, 전혀 작동하지 않습니다 self.text_A.Bind(wx.EVT_MENU, self.handle_A, self.menu.foo.bar_A) 같은과 메뉴 이벤트에 바인딩

import wx 


class Foo(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, size=(600, 480)) 

     self.init_menu() 
     self.init_text() 

     self.Centre() 
     self.Show(True) 

    def init_menu(self): 
     self.menu = wx.MenuBar() 
     self.SetMenuBar(self.menu) 

     self.menu.foo = wx.Menu() 
     self.menu.Append(self.menu.foo, "&Foo") 

     self.menu.foo.bar_A = self.menu.foo.Append(wx.ID_ANY, "Bar&A\tShift+A") 
     self.menu.foo.bar_B = self.menu.foo.Append(wx.ID_ANY, "Bar&B\tShift+B") 

     self.Bind(wx.EVT_MENU, self.handle_A, self.menu.foo.bar_A) 
     self.Bind(wx.EVT_MENU, self.handle_B, self.menu.foo.bar_B) 

    def init_text(self): 
     self.box = wx.BoxSizer(wx.HORIZONTAL) 
     self.SetSizer(self.box) 

     self.text_A = wx.TextCtrl(self, style=wx.TE_MULTILINE) 
     self.text_B = wx.TextCtrl(self, style=wx.TE_MULTILINE) 

     self.box.Add(self.text_A, 1, flag=wx.EXPAND) 
     self.box.Add(self.text_B, 1, flag=wx.EXPAND) 

    def handle_A(self, event): 
     print('A') 

    def handle_B(self, event): 
     print('B') 

app = wx.App() 
Foo() 
app.MainLoop() 

menu.foo.bar_A 비활성화해야합니다 (그리고 menu.foo.bar_B 사용).

wx.EVT_KILL_FOCUSwx.EVT_SET_FOCUS을 사용하여 메뉴 항목을 바인딩/바인딩 해제하고, 바로 가기 키를 설정/재설정하고 메뉴 항목을 활성화/비활성화 할 수 있습니까? 큰 응용 프로그램에서는 복잡해 보입니다. 일반적으로 wxPython 응용 프로그램이 메뉴 바로 가기 키의 범위를 제한하고 메뉴 항목을 동적으로 활성화/비활성화하는 적절한 방법 (가장 자주 깨끗하고 깔끔한 방식)을 알고 싶습니다.

감사합니다.

답변

1

나는 몇 년 전 메뉴에 대해 기사를 쓴 : http://www.blog.pythonlibrary.org/2008/07/02/wxpython-working-with-menus-toolbars-and-accelerators/

그것은 거기에 메뉴를 사용하지 않도록 설정하는 방법에 대한 이야기. 이것에 대한 wxPython 데모 패키지의 예제도 있습니다. 아마 프레임 워크에 메뉴 이벤트를 바인딩해야한다고 생각하지만 텍스트 컨트롤에 바인딩하면 아마 작동하지 않을 것입니다. 나는 focus 이벤트가 아마도 enable/disable 비트를 수행하는 더 좋은 장소라고 생각한다.

이벤트를 바인딩 해제하려면 UnBind 메서드를 사용하십시오. 자세한 내용은 http://zetcode.com/wxpython/events/ 또는 http://www.wxpython.org/docs/api/wx.EvtHandler-class.html을 참조하십시오.

+0

위의 모든 참조에 대해 실제로 내가하고 싶은 부분에 대한 가장 흥미로운 부분은 문서 끝에 wxUpdateUIEvent를 언급하는 * Update * 부분 일 것입니다. 제가 할 수있는 좋은 사례를 알고 있습니까? 그것을 사용하는 법을 배워라. 간단한 Google 검색 후에 나는 많은 것을 찾을 수 없었습니다 ... – kynikos

+0

나는 그것을 그렇게 많이 사용하지 않았습니다. wxPython 데모 또는 메일 링리스트에서 가져온 것 같습니다. 부담없이 물어보십시오. –