wxPython:菜单键快捷键和动态禁用的范围

时间:2011-11-08 12:30:51

标签: python menu wxpython keyboard-shortcuts

我在Arch Linux x86_64上使用Python 2.7.2和wxPython 2.8.12.1。

我想让以下示例以这种方式工作:
*当离开TextCtrl(text_A)有焦点时,按Shift+A它应该执行do_A(),按Shift+B它应该在文本区域写B ;另外,menu.foo.bar_B应被禁用(并启用menu.foo.bar_A
*当右侧TextCtrl(text_B)具有焦点时,按Shift+A它应在文本区域中写入A,然后按Shift+B它应执行do_B() ;另外,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 个答案:

答案 0 :(得分: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