使用加速器表捕获按键,而不会阻止键入文本控件

时间:2011-11-07 05:42:10

标签: python wxpython

我正在尝试使用加速器表来在窗口中全局捕获按键,以便我可以触发一个方法作为响应。但是,加速器表似乎会破坏通过按键创建的事件,从而阻止我将其键入文本控件。有没有办法解决这个问题,或者解决我的问题?

编辑:以下是一种更好的例子:

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 :(得分: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/