Рубрики
Без рубрики

WXPYPHON: ловить ключ и события CHAR

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

В этом посте я подробному, как поймать определенные ключевые прессы и почему это может быть полезно. Это еще один в моей серии «запрошенных» учебников. Там действительно не так много для ловли ключевые прессы, но это может быть немного запутанным, когда один виджет ведет себя немного по-разному от другого. Действительно сложные вещи приходят, когда вам нужно захватить EVT_CHAR.

Сначала я охвачу ключевые события, wx.evt_key_down и wx.evt_key_up, а затем я пойду над тонкостями wx.evt_char. Я считаю, что программирование проще всего понимать, если вы видите какой-то пример код, поэтому я начну с простым примером:

import wx
 
class MyForm(wx.Frame):
 
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Key Press Tutorial")
 
        # Add a panel so it looks the correct on all platforms
        panel = wx.Panel(self, wx.ID_ANY)
        btn = wx.Button(panel, label="OK")

        btn.Bind(wx.EVT_KEY_DOWN, self.onKeyPress)
        
    def onKeyPress(self, event):
        keycode = event.GetKeyCode()
        print keycode
        if keycode == wx.WXK_SPACE:
            print "you pressed the spacebar!"
        event.Skip()

    
# Run the program
if __name__ == "__main__":
    app = wx.PySimpleApp()
    frame = MyForm()
    frame.Show()
    app.MainLoop()

Вы заметите, что единственными виджетами следствия в этом листе кода являются панель и кнопка. Я связываю кнопку до EVT_KEY_Down и в обработчике, я проверяю, нажал ли пользователь пробел. Событие только загорается, если кнопка имеет фокус. Вы заметите, что я также называю «Event.skip» в конце. IIF Вы не звоните Skip, то ключ «съел», и не будет соответствующего события Char. Это не имеет значения на кнопке, но вы можете заботиться о управлении текстовым управлением, поскольку Char Contround – это правильный способ ловить верхний и нижний регистр, акценты, умлауты и тому подобное.

Я использовал аналогичный метод, чтобы поймать клавишу со стрелкой, в приложении к моим типу электронной таблицы. Я хотел, чтобы иметь возможность обнаружить эти ключи так, чтобы если я редактирую клетку, нажатие клавиши со стрелкой сделает изменение выбора в другую клетку. Это не поведение по умолчанию. В сетке каждая ячейка имеет свой собственный редактор и нажатие клавиш со стрелками просто перемещает курсор вокруг в ячейке.

Просто для удовольствия, я создал аналогичный пример к тому, где я связан с ключом и событиями ключа, но с двумя разными виджетами. Проверьте это ниже:

import wx
 
class MyForm(wx.Frame):
 
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Key Press Tutorial 2")
 
        # Add a panel so it looks the correct on all platforms
        panel = wx.Panel(self, wx.ID_ANY)
        sizer = wx.BoxSizer(wx.VERTICAL)
        
        btn = self.onWidgetSetup(wx.Button(panel, label="OK"), 
                                 wx.EVT_KEY_UP,
                                 self.onButtonKeyEvent, sizer)
        txt = self.onWidgetSetup(wx.TextCtrl(panel, value=""),
                                 wx.EVT_KEY_DOWN, self.onTextKeyEvent,
                                 sizer)
        panel.SetSizer(sizer)
        
    def onWidgetSetup(self, widget, event, handler, sizer):
        widget.Bind(event, handler)
        sizer.Add(widget, 0, wx.ALL, 5)
        return widget
        
    def onButtonKeyEvent(self, event):
        keycode = event.GetKeyCode()
        print keycode
        if keycode == wx.WXK_SPACE:
            print "you pressed the spacebar!"
        event.Skip()
        
    def onTextKeyEvent(self, event):
        keycode = event.GetKeyCode()
        print keycode
        if keycode == wx.WXK_DELETE:
            print "you pressed the delete key!"
        event.Skip()

    
# Run the program
if __name__ == "__main__":
    app = wx.PySimpleApp()
    frame = MyForm()
    frame.Show()
    app.MainLoop()

По общему признанию, это в основном для иллюстрации. Главное, чтобы знать, что вы действительно не используете evt_key_up, если вам не нужно следить за многоключевыми комбинациями, такими как Ctrl + K + Y или что-то (в полузащитной основе, см. WX.Acceleratortortable). Пока я не делаю это в моем примере, важно отметить, что если вы проверяете ключ CTRL, то лучше всего использовать Event.cmddown (), а не Event.controldown. Причина в том, что CMDDown является эквивалентом контратауна в Windows и Linux, но на Mac он имитирует командный ключ. Таким образом, CMDDown является лучшим перекрестным платформенным способом проверки, был ли ключ CTRL нажата.

И это действительно все, что вам нужно знать о ключевых событиях. Давайте посмотрим и посмотрим, что мы можем узнать о событиях Char. Вот простой пример:

import wx
 
class MyForm(wx.Frame):
 
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Char Event Tutorial")
 
        # Add a panel so it looks the correct on all platforms
        panel = wx.Panel(self, wx.ID_ANY)
        btn = wx.TextCtrl(panel, value="")

        btn.Bind(wx.EVT_CHAR, self.onCharEvent)
        
    def onCharEvent(self, event):
        keycode = event.GetKeyCode()
        controlDown = event.CmdDown()
        altDown = event.AltDown()
        shiftDown = event.ShiftDown()

        print keycode
        if keycode == wx.WXK_SPACE:
            print "you pressed the spacebar!"
        elif controlDown and altDown:
            print keycode
        event.Skip()

    
# Run the program
if __name__ == "__main__":
    app = wx.PySimpleApp()
    frame = MyForm()
    frame.Show()
    app.MainLoop()

Я думаю, что главное, что другое – это то, что вы хотите проверить наличие акцентов или международных персонажей. Таким образом, у вас будут сложные условные условные, которые проверяют, будут ли нажаты определенные ключи и в каком порядке. Робин Данн (создатель WXPYPHON) сказал, что WXSTC проверяет как ключ и события CHAR. Если вы планируете поддержать пользователей за пределами США, вы, вероятно, захотите узнать, как это все работает.

Робин Данн продолжил, чтобы сказать, что Если вы хотите получить ключевые события, чтобы обрабатывать «команды» в приложении, то использование необработанных значений в обработчике EVT_KEY_Down подходит. Однако, если намерение состоит в том, чтобы обработать запись «текста», то приложение должно использовать приготовленные значения в обработчике событий EVT_CHAR, чтобы получить правильное обращение для несовместимых клавиатур и редакторов ввода. (Примечание: ключевые события up и key down считаются «сырыми», тогда как события CHAR были «приготовлены» для вас.) Как объяснил это Робин Данн, На неамериканских клавиатурах тогда часть приготовления ключевых событий в события CHAR сопоставляет физические ключи на национальную карту клавиатуры, создавать символы с акцентами, Umlauts и такими.

Прошу прощения, что этот учебник не охватывает больше по поводу событий Char, но я просто не мог найти много для примеров.

Эти образцы кода были проверены на следующем

  • Windows Vista SP2, WxPython 2.8.9.2 (Unicode), Python 2.5.2

Загрузки

  • Примеры ключа и чар (ZIP)
  • Примеры ключа и чар (TAR)

Дальнейшее чтение