Как да заснема специални ключове за конзолно приложение на python

Python 2.7

Опитвам се да уловя натискания на клавиши в приложение, което пиша, използвайки функцията getch() в модула msvcrt. Някои са лесни, enter е 13, backspace е 8, .> е 46 и т.н. Някои клавиши, като Home, не мога да разбера.

От docstring за 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
Да, ти си прав. Идеята ми не показва обратната наклонена черта.   -  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