Метод 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':
...
И так далее... Любая помощь?
Ответы
Ответ 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)