Как захватить специальные ключи для консольного приложения Python

Питон 2.7

Я пытаюсь зафиксировать нажатия клавиш в приложении, которое пишу, используя функцию getch() в модуле msvcrt. Некоторые из них просты, Enter — 13, Backspace — 8, .> — 46 и т. д. Некоторые клавиши, такие как Home, я не могу отработать.

Из строки документации для getch():

«Если нажатая клавиша была специальной функциональной клавишей, она вернет «000» или «xe0»; следующий вызов вернет код клавиши».

Я пытался проверить возвращаемое значение «000» или «xe0», но оно не возвращается. Что происходит, я получаю 224, и при следующем вызове getch() я получаю другой код, поэтому для Home это 71. Другие специальные клавиши ведут себя так же, End — 224 79, Insert — 224 82, Page Up — 224 73. и т.д. Я не могу объяснить это поведение; Я пытался посмотреть, помогает ли сложение двух значений вместе, а затем снятие степени двойки (т.е. 224 + 73 - 256), но это не дает ничего полезного.

Кто-нибудь понимает это поведение и/или есть ли у кого-нибудь совет о том, как захватить эти ключи (я не хотел жестко кодировать значения шаблона 224 + x, поскольку я не уверен, что они согласуются с другими пользователями)?

Спасибо.

РЕДАКТИРОВАТЬ: код, если кто-то хочет попробовать

import msvcrt

while True:
    key = msvcrt.getch()
    print ord(key)

person Ashiataka    schedule 26.08.2014    source источник
comment
Это не 'xe0', это '\xe0' (обратите внимание на обратную косую черту, указывающую на экранирующую последовательность) . 224 — это просто десятичное значение этого байта: ord('\xe0') == 224   -  person Lukas Graf    schedule 26.08.2014
comment
Отлично, спасибо. Я не уверен, что я просто тупой или это должно быть ясно указано в документах?   -  person Ashiataka    schedule 26.08.2014
comment
Ну, это есть в документах включая обратную косую черту - не уверен, к чему вы клоните.   -  person Lukas Graf    schedule 26.08.2014
comment
Да вы правы. Мой ide не отображает обратную косую черту.   -  person Ashiataka    schedule 26.08.2014


Ответы (1)


Упомянутое значение, возвращаемое getch(), — это не 'xe0', это '\xe0' — обратите внимание на обратную косую черту, указывающую на ссылку экранирующая последовательность. 224 — это просто десятичное значение этого байта:

ord('\xe0') == 224

Итак, в вашем случае это должно работать:

while True:
    key = msvcrt.getch()
    if key in ('\000', '\xe0'):
        # special key, handle accordingly
        # ...
person Lukas Graf    schedule 26.08.2014