我正在尝试使用加速器表来在窗口中全局捕获按键,以便我可以触发一个方法作为响应。但是,加速器表似乎会破坏通过按键创建的事件,从而阻止我将其键入文本控件。有没有办法解决这个问题,或者解决我的问题?
编辑:以下是一种更好的例子:
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()类型的东西我可以在这里使用?
答案 0 :(得分: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/