の機能をPythonで実装しようとしています。F1-F12や矢印キーなどの特殊キーのリストも返す必要があります。これらの特殊キーは、シーケンス内に複数の文字を生成します。したがって、getch()
は、ブロックモードで1つのcharを読み込み、入力バッファに余分な文字があるかどうかをチェックして、それらも取得する必要があります。Linuxターミナルバッファーで余分な文字がないか確認してください
私はtermios.FIONREADと一緒に呼び出して、入力バッファーのバイト数を取得しています。バッファーに積み重ねられた非特殊キープレスをキャッチしますが、特別なキーから余分な記号を逃します。 2つの異なるバッファがあるようだし、誰かがこれを説明できるならばいいだろう。途中で
from time import sleep
def getch():
import sys, tty, termios
fd = sys.stdin.fileno()
# save old terminal settings, because we are changing them
old_settings = termios.tcgetattr(fd)
try:
# set terminal to "raw" mode, in which driver returns
# one char at a time instead of one line at a time
#
# tty.setraw() is just a helper for tcsetattr() call, see
# http://hg.python.org/cpython/file/c6880edaf6f3/Lib/tty.py
tty.setraw(fd)
ch = sys.stdin.read(1)
# --- check if there are more characters in buffer
from fcntl import ioctl
from array import array
sleep(1)
buf = array('i', [0])
ioctl(fd, termios.FIONREAD, buf)
print "buf queue: %s," % buf[0],
# ---
finally:
# restore terminal settings. Do this when all output is
# finished - TCSADRAIN flag
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
char = ''
while char != 'q':
char = getch()
print 'sym: %s, ord(%s)' % (char, ord(char))
注sleep(1)
:ここ
は、インタラクティブな例です。この第二の有効期限が切れる前に、あなたが一つのキーをヒットした場合、出力は次のようになります。
5つの通常のキー(例えば「asdfg」)についてはbuf queue: 0, sym: l, ord(108)
1秒で入力し、出力は次のようになります。
buf queue: 4, sym: a, ord(97)
が、シングル矢印キー、出力用:
-
:
通常のキープレスでキュー内の4つのシンボルが破棄されるのはなぜですか? 「raw」端末モードに切り替えるのはそれですか?端末を「生」モードにしないで、その後の
getch()
の実行で文字を保持する方法はありますか?ioctl
なぜ特殊キープレスのバッファが空白なのですか?その後の文字はどこから来ていますか?getch()
が実行されていますか?それらをチェックする方法?
buf queue: 0, sym: , ord(27)
buf queue: 0, sym: [, ord(91)
buf queue: 0, sym: D, ord(68)
ここでは2つの質問があります。
[[Pythonで単一文字(ゲッチ形式)を読む]がUnixで動作しない](http://stackoverflow.com/questions/1052107/reading-a-single-character-getch-style-in- Python-is-not-un-unix) –
重複していても閉じていません。 –