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

1 投票
1 回答
1056 浏览
提问于 2025-04-17 05:46

我想用一个加速器表来全局捕捉窗口中的按键,这样我就可以在按键时执行某个方法。但是,加速器表似乎会阻止按键事件的产生,导致我无法在文本框中输入内容。有没有什么办法可以解决这个问题,或者其他的解决方案呢?

补充说明:这里有一个更好的例子来说明这种情况:

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/

撰写回答