Оператор 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.