【发布时间】:2011-11-08 12:30:50
【问题描述】:
我在 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 应用程序限制菜单快捷键范围和动态启用/禁用菜单项的正确(最常见、最干净和整洁)的方式。
谢谢!
【问题讨论】:
标签: python menu wxpython keyboard-shortcuts