Подтвердить что ты не робот

Метод Python для чтения нажатия клавиши?

Я новичок в Python, и я просто создал игру и меню на Python. Вопрос в том, что использование (raw_) input() требует, чтобы я нажимал enter после каждого нажатия клавиши, я хотел бы сделать так, чтобы при нажатии вниз стрелка мгновенно выбирает следующий пункт меню или перемещается вниз в игре. На данный момент это требует от меня типа типа "вниз", а затем нажмите enter. Я также провел довольно много исследований, но я бы предпочел не загружать огромные модули (например, pygame) только для достижения одного метода keyDown(). Итак, есть ли более простые способы, которых я просто не мог найти?

Edit: Просто узнал, что msvcrt.getch() сделает трюк. Это не keyDown(), но он работает. Тем не менее, я не уверен, как его использовать, это кажется довольно странным, любая помощь здесь? Это то, что я получил в данный момент:

from msvcrt import getch
while True:
    key = getch()
    print(key)

Однако он продолжает давать мне все эти бессмысленные байты, например, стрелка вниз:

b'\xe0'
b'P'

И я понятия не имею, как их использовать, я пытался сравнить с chr() и даже использовать ord(), но не могу делать никаких сравнений. Я пытаюсь сделать это в основном:

from msvcrt import getch
while True:
    key = getch()
    if key == escape:
        break
    elif key == downarrow:
        movedown()
    elif key == 'a':
        ...

И так далее... Любая помощь?

4b9b3361

Ответ 1

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

Примечание: правильный keyDown(), который распознает все клавиши и фактические нажатия клавиш, по-прежнему оценивается.

Решение: с помощью ord() -функции, чтобы сначала превратить getch() в целое число (я думаю, они являются кодами виртуальных клавиш, но не слишком уверенными) отлично работает, а затем сравнивает результат до фактического числа, представляющего желаемый ключ. Кроме того, если бы мне было нужно, я мог бы добавить дополнительный chr() вокруг возвращаемого числа, чтобы он преобразовал его в символ. Тем не менее, я использую в основном стрелку вниз, esc и т.д., Поэтому преобразование их в характер будет глупо. Здесь последний код:

from msvcrt import getch
while True:
    key = ord(getch())
    if key == 27: #ESC
        break
    elif key == 13: #Enter
        select()
    elif key == 224: #Special keys (arrows, f keys, ins, del, etc.)
        key = ord(getch())
        if key == 80: #Down arrow
            moveDown()
        elif key == 72: #Up arrow
            moveUp()

Кроме того, если кому-то еще нужно, вы можете легко узнать коды ключей из Google или использовать python и просто нажать клавишу:

from msvcrt import getch
while True:
    print(ord(getch()))

Ответ 2

Смотрите документы MSDN getch. В частности:

Функции _getch и_getwch читают один символ с консоли без повторения символа. Ни одна из этих функций не может использоваться для чтения CTRL + C. При чтении функциональной клавиши или клавиши со стрелкой каждая функция должна вызываться дважды; первый вызов возвращает 0 или 0xE0, а второй вызов возвращает фактический key code.

Функция Python возвращает символ. вы можете использовать ord() для получения целочисленного значения, которое вы можете проверить, например keycode = ord(msvcrt.getch()).

Итак, если вы читаете 0x00 или 0xE0, прочитайте его во второй раз, чтобы получить key code для стрелки или функциональной клавиши. Из экспериментов 0x00 предшествует F1-F10 (0x3B-0x44) и 0xE0 предшествует клавишам со стрелками и Ins/Del/Home/End/PageUp/PageDown.

Ответ 3

from msvcrt import getch

pos = [0, 0]

def fright():
    global pos
    pos[0] += 1

def fleft():
    global pos 
    pos[0] -= 1

def fup():
    global pos
    pos[1] += 1

def fdown():
    global pos
    pos[1] -= 1

while True:
    print'Distance from zero: ', pos
    key = ord(getch())
    if key == 27: #ESC
        break
    elif key == 13: #Enter
        print('selected')
    elif key == 32: #Space
        print('jump')
    elif key == 224: #Special keys (arrows, f keys, ins, del, etc.)
        key = ord(getch())
        if key == 80: #Down arrow
            print('down')
            fdown
        elif key == 72: #Up arrow
            print('up')
            fup()
        elif key == 75: #Left arrow
            print('left')
            fleft()
        elif key == 77: #Right arrow
            print('right')
            fright()

Ответ 4

Я действительно не хотел публиковать это как комментарий, потому что мне нужно будет прокомментировать все ответы и исходный вопрос.

Все ответы, кажется, полагаются на MSVCRT Microsoft Visual C Runtime. Если вы хотите избежать этой зависимости:

Если вам нужна кроссплатформенная поддержка, используйте библиотеку здесь:

https://pypi.org/project/getkey/#files

https://github.com/kcsaff/getkey

Может предложить более элегантное решение.

Пример кода:

from getkey import getkey, keys
key = getkey()
if key == keys.UP:
  ...  # Handle the UP key
elif key == keys.DOWN:
  ...  # Handle the DOWN key
elif key == 'a':
  ...  # Handle the 'a' key
elif key == 'Y':
  ...  # Handle 'shift-y'
else:
  # Handle other text characters
  buffer += key
  print(buffer)