これは、単一の文字を取得するために、stdinをrawモード(バッファリングを無効にしてEnterを押す必要がない)にする単純なループです。私はあなたがPythonでキーのリリースを検出するためのループに持っていると思う
import tty
import sys
import termios
orig_settings = termios.tcgetattr(sys.stdin)
tty.setraw(sys.stdin)
x = 0
while x != chr(27): # ESC
x=sys.stdin.read(1)[0]
print("You pressed", x)
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, orig_settings)
:あなたは(それを無効にするwith
の文のような)よりスマートな何かを行う必要がありますが、あなたはここにアイデアを得ます。
ETAもう少し説明:Linuxの
、あなたのプログラムへの入力は行がをバッファリングされます。これは、オペレーティングシステムが行全体を保持するまで入力をバッファリングすることを意味します。つまり、ユーザーが 'enter'を押すまで、ユーザーが入力したものも表示されません。言い換えれば、あなたのプログラムがユーザに 'w'と入力してこれを実行することを期待している場合、 'w'はユーザが 'enter'を押すまでOSのバッファに座ります。この時点で、行全体がプログラムに渡されるので、ユーザーの入力として文字列 "w \ n"が得られます。
これを無効にするには、ttyをrawモードに入れます。これは、Python関数tty.setraw
で行います。これはlinuxのttyドライバを呼び出して、バッファリングを停止するように指示します。私はそれをsys.stdin
引数に渡して、のバッファリングをオフにしたいストリームを指定しました。したがって、tty.setraw
呼び出しの後、上記のループはユーザーが押すすべてのキーの出力を提供します。
しかし、いったんプログラムが終了すると、ttyはまだrawモードになっています。現代のターミナル設定が提供するパワー(コントロールやエスケープシーケンスを使用する場合など)が得られないので、これは不満足なものです。たとえば、プログラムを終了するときに問題が発生している可能性があります(ctrl-C
)。したがって、入力文字の読み込みが終了したらの調理モードに端末を戻す必要があります。 termios.tcsetattr
の呼び出しは、単に「端末を私が見つけた方法に戻す」と言っています。それは最初にtermios.tcgetattr
を呼び出すことによってこれを行う方法を知っています。プログラムの冒頭に「端末の現在の設定をすべて教えてください」と言います。
すべてのことを理解したら、プログラムに適した機能で簡単に機能をカプセル化することができます。
stdin
は、入力がユーザーからあなたに届くストリームです。ウィキペディアはstandard streamsについて詳しく説明しています。
キーバインディングを使用してグラフィカルインターフェイスをチェックアウトすることがあります:tk:https://docs.python.org/3/library/tk.html – LittleByBlue