我在Python中使用raw_input
与shell中的用户进行交互。
c = raw_input('Press s or n to continue:')
if c.upper() == 'S':
print 'YES'
按预期工作,但用户必须在按's'后按下回车键。有没有办法从用户输入完成我需要的东西,而无需在shell中按Enter键?我正在使用* nixes机器。
答案 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)