使用加速器表捕获按键而不阻止文本控件输入
我想用一个加速器表来全局捕捉窗口中的按键,这样我就可以在按键时执行某个方法。但是,加速器表似乎会阻止按键事件的产生,导致我无法在文本框中输入内容。有没有什么办法可以解决这个问题,或者其他的解决方案呢?
补充说明:这里有一个更好的例子来说明这种情况:
class MainWindow(wx.Frame):
def __init__(self, parent, title):
wx.Frame.__init__(self, parent, title=title, size=(-1,-1))
...
randomId = wx.NewId()
parent.Bind(wx.EVT_MENU, self.onKey, id=randomId)
accTable = wx.AcceleratorTable([(wx.ACCEL_NORMAL, 96, randomId)]) # 96 is the keycode for `
self.SetAcceleratorTable(accTable)
...
class ctrlpanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
...
grid = wx.GridBagSizer(hgap=7, vgap=7)
self.lblfreq = wx.StaticText(self, label="Base Frequency (hz): ")
grid.Add(self.lblfreq, pos=(0,0))
self.freq = wx.TextCtrl(self, value="0", size=(100, 20))
grid.Add(self.freq, pos=(0,1))
self.waveList = ['Sine', 'Semicircle', 'Saw', 'Square']
self.lblwave = wx.StaticText(self, label="Wave Shape: ")
grid.Add(self.lblwave, pos=(1,0))
self.wave = wx.Choice(self, choices=self.waveList)
self.wave.SetStringSelection('Sine')
grid.Add(self.wave, pos=(1,1))
self.SetSizerAndFit(grid)
使用这段代码,加速器表工作得很好,无论窗口的焦点在哪里,它都能捕捉到我的按键,并激活onKey方法。然而,当焦点在文本框上时,我无法在文本框中输入我按下的字符,因为加速器表会在事件传递到其他地方之前就处理掉它,或者阻止正常事件的发生。我希望能够让事件正常发生,这样在文本框中输入时,文本能够显示出来,即使这些按键在窗口中设置了其他的操作。有没有类似event.Skip()的东西可以用在这里呢?
1 个回答
0
要说出问题是什么,其实很难,因为缺少更多的信息,比如你的操作系统、wx版本,或者一个能展示问题的小例子。不过,这里有几个相关的文章,可能会帮助你找到问题所在:
http://www.blog.pythonlibrary.org/2008/07/02/wxpython-working-with-menus-toolbars-and-accelerators/
http://www.blog.pythonlibrary.org/2010/12/02/wxpython-keyboard-shortcuts-accelerators/