Поймать нажатие клавиши с помощью таблиц акселератора, не мешая набирать текстовые элементы управления

1

Я пытаюсь использовать таблицу ускорителей, чтобы поймать нажатие клавиши глобально в окне, чтобы я мог запустить метод в ответ. Однако таблица ускорителей, по-видимому, уничтожает событие, которое иначе было бы создано, нажав клавишу, не позволяя мне вводить текст в текстовые элементы управления. Есть ли способ обойти это поведение или какое-то другое решение моей проблемы?

Изменение: Здесь лучший пример такой ситуации:

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
    Можете ли вы предоставить небольшой пример кода, который демонстрирует проблему?
Теги:
wxpython

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/

  • 0
    Я уже посмотрел на этих страницах. Они помогли мне понять, как использовать таблицу акселераторов, но у них нет информации о моей текущей проблеме, которая позволяет нормально обрабатывать ключевые события моими средствами управления после того, как таблица акселераторов сделана с ними.
  • 0
    Вам может понадобиться вызвать event.Skip () в конце обработчика
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню