这是一个简单的循环,将标准输入设置为原始模式(禁用缓冲,这样您就不必按回车键),以获取单个字符。您应该做一些更明智的事情(比如使用with
语句来禁用它),但是您可以从这里得到灵感:
import tty
import sys
import termios
orig_settings = termios.tcgetattr(sys.stdin)
tty.setcbreak(sys.stdin)
x = 0
while x != chr(27):
x=sys.stdin.read(1)[0]
print("You pressed", x)
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, orig_settings)
我认为你需要循环来检测Python中的键松开。
稍微解释一下:
在Linux上,输入到程序中将是行缓冲的。这意味着操作系统会缓存输入直到收集到整行,所以你的程序甚至不会看到用户输入的任何东西,直到用户也按下“回车”键。换句话说,如果你的程序期望用户键入'w',而用户确实这样做了,'w'将一直停留在操作系统的缓冲区中,直到用户按下“回车”键。此时整个行被传递给你的程序,因此你将获得字符串"w\n"作为用户的输入。
你可以通过将tty置于原始模式来禁用此功能。您可以使用Python函数tty.setcbreak
来实现这一点,该函数会向linux中的tty驱动程序发出调用以告诉它停止缓冲。我将其传递给了sys.stdin
参数,以告诉它我要为其关闭缓冲的流1。因此,在调用tty.setcbreak
之后,上面的循环将为用户按下的每个键提供输出。
但是,一个问题是,一旦您的程序退出,tty仍处于原始模式。您通常会发现这很不满意,因为您没有使用现代终端设置所提供的任何功能(例如使用控制或转义序列时)。例如,请注意您可能会在使用ctrl-C
退出程序时遇到麻烦。因此,在完成读取输入字符后,应将终端恢复为熟悉的模式。调用termios.tcsetattr
只是说“将终端恢复为我找到的方式”。它通过在程序开始时首先调用termios.tcgetattr
来了解“告诉我终端的所有当前设置”来进行此操作。
一旦您理解了所有这些,您应该可以轻松地将该功能封装在适合您的程序的函数中。
1stdin
是用户输入到您手中的流。维基百科可以告诉您更多关于标准流的信息。