Оператор if, включая raw_input, просто печатает все, что я ввожу на клавиатуру

Я очень плохо знаком с Python и программированием в целом, и я хочу распечатать строку "вперед" всякий раз, когда я нажимаю "w" на клавиатуре. Это тест, который я превращу в пульт дистанционного управления для моторизованного автомобиля.

while True:
    if raw_input("") == "w":
        print "forward"

Почему он просто распечатывает каждый ключ, который я печатаю?

2 ответа

Решение

В Python 2.x функция raw_input отображает все нажатые символы и возвращается после получения новой строки. Если вам нужно другое поведение, вам придется использовать другую функцию. Вот портативная версия getch для Python, она будет возвращать каждое нажатие клавиши:

# Copied from: stackru.com/questions/510357/python-read-a-single-character-from-the-user
def _find_getch():
    try:
        import termios
    except ImportError:
        # Non-POSIX. Return msvcrt's (Windows') getch.
        import msvcrt
        return msvcrt.getch

    # POSIX system. Create and return a getch that manipulates the tty.
    import sys, tty
    def _getch():
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        try:
            tty.setraw(fd)
            ch = sys.stdin.read(1)
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
        return ch

    return _getch

getch = _find_getch()

Это можно использовать так:

while True:
    if getch() == "w":
        print "forward"

raw_input читает всю строку ввода. Строка, которую вы вводите, становится видимой для вас, и вы можете делать что-то вроде текста:

aiplanes

оставьте несколько символов, чтобы исправить опечатку:

airplanes

вернитесь к концу и удалите символ, потому что вы не хотели делать его множественным:

airplane

и затем нажмите Enter, и raw_input вернусь "airplane", Он не просто сразу возвращается, когда вы нажимаете клавишу на клавиатуре.


Если вы хотите прочитать отдельные ключи, вам нужно будет использовать процедуры управления терминалом более низкого уровня для ввода данных. В Unix curses модуль будет подходящим инструментом; Я не уверен, что бы вы использовали в Windows. Я не делал этого раньше, но в Unix, я думаю, вам нужно установить терминал в режим raw или cbreak и принять ввод с window.getkey() или же window.getch(), Возможно, вам также придется отключить эхо с curses.noecho(); Я не уверен, включен ли он в режим raw/cbreak.

Другие вопросы по тегам