Python Терминал MacOS: клавиши со стрелками на клавиатуре в raw_input () - PullRequest
0 голосов
/ 08 марта 2020

Используя Python 2.7, я бы хотел, чтобы моя программа принимала клавиши со стрелками клавиатуры - например, при вводе в терминал MacOS.

Нажатие в Терминал выводит ^[[A в нем, поэтому я предположил, что это последовательность клавиш выхода.

Однако, нажимая и RETURN на raw_input() Кажется, что приглашение не производит строку, которая может быть обусловлена:

string = raw_input('Press ↑ Key: ')

if string == '^[[A':
    print '↑'         # This doesn't happen.

Как это можно сделать?

Обратите внимание, что я не пытаюсь вводить то, что было в предыдущей строке в оболочке (думаю, это было import readline управляет). Я просто хочу обнаружить, что клавиша со стрелкой на клавиатуре была как-то введена.

Ответы [ 2 ]

1 голос
/ 08 марта 2020

Когда я пытался что-то вроде:

% cat test.py
char = raw_input()
print("\nInput char is [%s]." % char)
% python a.py
^[[A
           ].

Это исключало "\ Input char is [" часть инструкции print. Похоже, что raw_input () не получает экранированные символы. Терминальная программа перехватывает нажатые клавиши и использует ее для управления экраном. Вам придется использовать программу более низкого уровня, чтобы поймать этих персонажей. Проверьте, если Нахождение значений клавиш со стрелками в Python: почему они утраиваются? помогают узнать, как получить эти нажатия клавиш.

Из текущего принятого ответа :

    if k=='\x1b[A':
            print "up"
    elif k=='\x1b[B':
            print "down"
    elif k=='\x1b[C':
            print "right"
    elif k=='\x1b[D':
            print "left"
    else:
            print "not an arrow key!"
1 голос
/ 08 марта 2020

Я думаю, что вы ищете pynput.keyboard.Listener, который позволяет вам контролировать клавиатуру и выполнять различные действия в зависимости от нажатой клавиши. Доступно для Python 2,7.

Этот пример - хороший способ начать:

from pynput import keyboard

def on_press(key):
    try:
        print('alphanumeric key {0} pressed'.format(
            key.char))
    except AttributeError:
        print('special key {0} pressed'.format(
            key))

def on_release(key):
    print('{0} released'.format(
        key))
    if key == keyboard.Key.esc:
        # Stop listener
        return False

# Collect events until released
with keyboard.Listener(
        on_press=on_press,
        on_release=on_release) as listener:
    listener.join()

# ...or, in a non-blocking fashion:
listener = keyboard.Listener(
    on_press=on_press,
    on_release=on_release)
listener.start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...