2011-11-08 16 views
0

私はPython 2.7.2とwxPython 2.8.12.1をArch Linux x86_64に使用しています。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は有効)。また、menu.foo.bar_Aを無効にする必要があります(とmenu.foo.bar_B有効)

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() 

self.text_A.Bind(wx.EVT_MENU, self.handle_A, self.menu.foo.bar_A)のようなものでメニューイベントへの結合は全く機能しません。

メニュー項目のバインド/アンバインド、ショートカットキーの設定/リセット、メニュー項目の有効/無効を使用するには、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のデモパッケージにも例があります。私はフレームのオブジェクトにメニューイベントをバインドする必要がありますが、おそらくテキストコントロールにバインドすることはできませんだと思います。私は、フォーカスイベントはおそらく有効/無効ビットを行うためのより良い場所だと思います。

イベントのバインドを解除するには、UnBindメソッドを使用します。詳細については、http://zetcode.com/wxpython/events/またはhttp://www.wxpython.org/docs/api/wx.EvtHandler-class.htmlを参照してください。

+0

これらの参考文献のおかげで、実際に私がしたいことのための最も興味深い部分は、おそらく 'wxUpdateUIEvent'に言及しているあなたの記事の最後の* Update *部分です。それを使用することを学ぶ?簡単なGoogleの検索の後、私は多くを見つけることができませんでした... – kynikos

+0

私はそれほど多くを使用していません。私はwxPythonデモかメーリングリストのいずれかからそれを得たと思います。お気軽にお尋ねください。 –