if 包含 raw_input 的语句只打印我在键盘上输入的任何内容

if statement including raw_input just prints whatever i type in to the keyboard

我对 python 和一般编程还很陌生,我想在键盘上按 "w" 时打印字符串 "forward"。这是一个测试,我将把它变成一个机动车的遥控器。

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

为什么它只打印出我键入的每个键?

raw_input 读取整行输入。您正在输入的行对您可见,您可以执行一些操作,例如键入一些文本:

aiplanes

请留下几个字符来更正您的错字:

airplanes

回到最后删除一个字符,因为你不是故意让它变成复数的:

airplane

然后按 Enter,然后 raw_input 将 return "airplane"。当您按下键盘键时,它不仅会立即 return。


如果您想要读取单个键,您将需要使用较低级别的终端控制例程来获取输入。在 Unix 上,curses 模块是一个合适的工具;我不确定您会在 Windows 上使用什么。我以前没有这样做过,但在 Unix 上,我认为您需要将终端设置为原始或 cbreak 模式,并使用 window.getkey()window.getch() 进行输入。您可能还必须关闭回显 curses.noecho();我不确定这是否包含在 raw/cbreak 模式中。

在 Python 2.x 中,raw_input 函数将显示所有按下的字符,并且 return 接收到换行符。如果您想要不同的行为,则必须使用不同的功能。这是 Python 的便携版 getch,它会 return 每次按键:

# Copied from: whosebug.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"