python中的raw_input没有按Enter键

时间:2010-08-19 15:07:17

标签: python user-input

我在Python中使用raw_input与shell中的用户进行交互。

c = raw_input('Press s or n to continue:')
if c.upper() == 'S':
    print 'YES'

按预期工作,但用户必须在按's'后按下回车键。有没有办法从用户输入完成我需要的东西,而无需在shell中按Enter键?我正在使用* nixes机器。

9 个答案:

答案 0 :(得分:16)

在Windows下,您需要msvcrt模块,具体而言,从您描述问题的方式来看,函数msvcrt.getch

  

阅读按键并返回   结果性格。什么都没有回应   到控制台。这个电话会阻止   如果还没有按键   可用,但不会等待回车   被迫。

(等 - 请参阅我刚才指出的文档)。对于Unix,请参阅例如this recipe用于构建类似getch函数的简单方法(另请参阅该配方的注释帖子中的几个备选方案和附录)。

答案 1 :(得分:10)

Python不提供开箱即用的多平台解决方案 如果您使用的是Windows,则可以尝试msvcrt

import msvcrt
print 'Press s or n to continue:\n'
input_char = msvcrt.getch()
if input_char.upper() == 'S': 
   print 'YES'

答案 2 :(得分:4)

实际上,与此同时(距该线程开始大约10年),出现了一个名为pynput的跨平台模块。 在第一个剪切点以下-即仅适用于小写字母's'。 我已经在Windows上对它进行了测试,但是几乎100%肯定它应该可以在Linux上运行。

from pynput import keyboard

print('Press s or n to continue:')

with keyboard.Events() as events:
    # Block for as much as possible
    event = events.get(1e6)
    if event.key == keyboard.KeyCode.from_char('s'):
        print("YES")

答案 3 :(得分:3)

您也可以使用WConio代替msvcrt模块:

>>> import WConio
>>> ans = WConio.getkey()
>>> ans
'y'

答案 4 :(得分:3)

curses也可以这样做:

import curses, time

#--------------------------------------
def input_char(message):
    try:
        win = curses.initscr()
        win.addstr(0, 0, message)
        while True: 
            ch = win.getch()
            if ch in range(32, 127): break
            time.sleep(0.05)
    except: raise
    finally:
        curses.endwin()
    return chr(ch)
#--------------------------------------
c = input_char('Press s or n to continue:')
if c.upper() == 'S':
    print 'YES'

答案 5 :(得分:2)

要获得单个字符,我使用了getch,但我不知道它是否适用于Windows。

答案 6 :(得分:1)

在旁注中,msvcrt.kbhit()返回一个布尔值,确定当前是否正在按下键盘上的任何键。

因此,如果您正在制作游戏或其他内容并且希望按键执行但不完全停止游戏,则可以在if语句中使用kbhit()以确保仅在用户处检索该键实际上想要做点什么。

Python 3中的一个例子:

# this would be in some kind of check_input function
if msvcrt.kbhit():
    key = msvcrt.getch().decode("utf-8").lower() # getch() returns bytes data that we need to decode in order to read properly. i also forced lowercase which is optional but recommended
    if key == "w": # here 'w' is used as an example
        # do stuff
    elif key == "a":
        # do other stuff
    elif key == "j":
        # you get the point

答案 7 :(得分:0)

我知道这很旧,但是解决方案对我来说还不够好。 我需要支持跨平台而不安装任何外部Python软件包的解决方案。

我的解决方案,以防万一其他人遇到这篇文章

参考:https://github.com/unfor19/mg-tools/blob/master/mgtools/get_key_pressed.py

from tkinter import Tk, Frame


def __set_key(e, root):
    """
    e - event with attribute 'char', the released key
    """
    global key_pressed
    if e.char:
        key_pressed = e.char
        root.destroy()


def get_key(msg="Press any key ...", time_to_sleep=3):
    """
    msg - set to empty string if you don't want to print anything
    time_to_sleep - default 3 seconds
    """
    global key_pressed
    if msg:
        print(msg)
    key_pressed = None
    root = Tk()
    root.overrideredirect(True)
    frame = Frame(root, width=0, height=0)
    frame.bind("<KeyRelease>", lambda f: __set_key(f, root))
    frame.pack()
    root.focus_set()
    frame.focus_set()
    frame.focus_force()  # doesn't work in a while loop without it
    root.after(time_to_sleep * 1000, func=root.destroy)
    root.mainloop()
    root = None  # just in case
    return key_pressed


def __main():
        c = None
        while not c:
                c = get_key("Choose your weapon ... ", 2)
        print(c)

if __name__ == "__main__":
    __main()

答案 8 :(得分:0)

如果您可以使用外部库,blessed(跨平台)可以很容易地做到这一点:

from blessed import Terminal

term = Terminal()

with term.cbreak(): # set keys to be read immediately 
    print("Press any key to continue")
    inp = term.inkey() # wait and read one character

请注意,在 with 块内时,终端的行编辑功能将被禁用。

cbreakinkey 和带有 inkeyexample 的文档。