2016-09-20 3 views
1

Я пытаюсь создать игру, где вы можете мгновенно передать вход пользователя на компьютер, вместо того чтобы нажимать enter каждый раз. Я знаю, как это сделать, но я не могу найти номер юникода для клавиш со стрелками. Есть ли unicode для этого, или я просто собираюсь застрять с wasd?unicode для клавиш со стрелками?

class _GetchUnix: 
    def __init__(self): 
     import tty, sys 
    def __call__(self): 
     import sys, tty, termios 
     fd = sys.stdin.fileno() 
     old_settings = termios.tcgetattr(fd) 
     try: 
      tty.setraw(sys.stdin.fileno()) 
      ch = sys.stdin.read(1) 
     finally: 
      termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) 
     return ch 
class _GetchWindows: 
    def __init__(self): 
     import msvcrt 
    def __call__(self): 
     import msvcrt 
     return msvcrt.getch() 
class _Getch: 
    def __init__(self): 
     try: 
      self.impl = _GetchWindows() 
     except ImportError: 
      self.impl = _GetchUnix() 
    def __call__(self): return self.impl() 
getch = Getch() 

Я с использованием getch.impl() в качестве входа проб или ошибок, как и в случае есть клавиша нажата, когда вызывается функция, она возвращает этот ключ, и движется дальше. Если клавиши не нажата, она просто включается.
Я использую Python 2.7.10

+3

Если вы «Я пытаюсь обрабатывать события клавиатуры или состояния клавиш, то, что вы хотите, не является Unicode. Клавиатуры не работают. Проверьте документацию на все, что вы используете для обработки ввода с клавиатуры. Если вы используете что-то, что работает с символами вместо клавиш клавиатуры, вам нужно использовать что-то еще. – user2357112

+2

«Я знаю, как это сделать» - можете ли вы рассказать нам, как вы это делаете? Как только мы узнаем, что вы сделали до сих пор, мы можем описать, что делать с клавишами со стрелками. –

+0

Вы можете использовать глифы Юникода стрелки с кодовыми точками U + 2190 через U + 2193, которые соответствуют соответственно стрелкам влево, вверх, вправо и вниз (←, ↑, ↓, →). Однако ваш код с использованием 'msvcrt' неверен. См. Ответ @Terry Jan Reedy для деталей. – martineau

ответ

1

Начать чтение соответствующего документа для msvcrt.

msvcrt.kbhit()

Возвращение верно, если нажатие клавиши ждет, чтобы читать.

msvcrt.getch()

Read нажатие клавиши и возвращает результирующий символ в виде строки байтов. На консоль ничего не отозвалось. Этот вызов будет блокироваться, если нажатие клавиши еще не доступно, но не будет ждать нажатия Enter. Если нажатой клавишей была специальная функциональная клавиша, это вернет «\ 000» или «\ xe0»; следующий вызов вернет код ключа. Клавиша Control-C не может быть прочитана с помощью этой функции.

Обратите внимание, что getch блокирует и требует двух вызовов для специальных функциональных клавиш, которые включают клавиши со стрелками (они первоначально возвращают b'\xe0).

Затем используйте sys.platform и напишите две версии функции get_arrow.

import sys 
if sys.platform == 'win32': 
    import msvcrt as ms 
    d = {b'H': 'up', b'K': 'lt', b'P': 'dn', b'M': 'rt'} 
    def get_arrow(): 
     if ms.kbhit() and ms.getch() == b'\xe0': 
      return d.get(ms.getch(), None) 
     else: 
      return None 
else: # unix 
... 

Я экспериментально определил отображение ключей кодов следующим кодом. (Это не будет работать при запуске в IDLE и, возможно, не в других GUI рамок, а Геч конфликтов с обработкой графического интерфейса клавиатуры.)

>>> import msvcrt as ms 
>>> for i in range(8): print(ms.getch()) 
... 
b'\xe0' 
b'H' 
b'\xe0' 
b'K' 
b'\xe0' 
b'P' 
b'\xe0' 
b'M' 

Я протестировал функцию на Windows, с

while True: 
    dir = get_arrow() 
    if dir: print(dir) 
+0

В этом вопросе ничего не говорится о том, что OP использует Windows. Знаете ли вы что-то, что не указано? – wallyk

+0

@wallyk: Тот факт, что OP имеет код с использованием модуля 'msvcrt', по крайней мере указывает, что он хочет, чтобы код работал в Windows. Итак, нет, это не было явно указано. – martineau

+0

Terry: Хорошо, но я думаю, что для ответа на вопрос OP вам нужно сопоставить значения 'getch()' с соответствующими значениями Unicode для символов стрелки, а также сделать то, что дает те же результаты в режиме Unix. – martineau