我在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_FOCUS
和wx.EVT_SET_FOCUS
绑定/取消绑定菜单项,设置/重置快捷键并启用/禁用菜单项?对于大型应用程序来说听起来很复杂,一般来说我想知道wxPython应用程序限制菜单快捷键范围和动态启用/禁用菜单项的正确(最常见,干净和整洁)方式。
谢谢!
答案 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。