2017-06-01 4 views
-1
k = stdscr.getch() 
if k == curses.KEY_UP: 
    sys.stdout.write('KEY_UP') 
elif k == curses.KEY_F1: 
    sys.stdout.write('KEY_F1') 
elif k == 113: 
    break 
else: 
    pass 

https://docs.python.org/2/library/curses.htmlPythonの呪い内

をF1-F12を検出する方法上記のコードは 'Q' とarrow_upを検出するために使用することができます。ただし、F1の検出には使用できません。

質問>特殊なファンクションキーを検出するために私が使用できるpython cursesの方法はありますか?

[更新]

私の端末タイプはxtermです。

elif k == 269: # 'F5' 
elif k == 270: # 'F6' 
elif k == 271: # 'F7' 
elif k == 272: # 'F8' 
elif k == 273: # 'F9' 
elif k == 27: # 'ESC' 
    special_keys = [stdscr.getch(), stdscr.getch(), stdscr.getch(), stdscr.getch()] 
    if special_keys == [91, 49, 49, 126]: 
     sys.stdout.write('F1\n') 
    if special_keys == [91, 49, 50, 126]: 
     sys.stdout.write('F2\n') 
    if special_keys == [91, 49, 51, 126]: 
     sys.stdout.write('F3\n') 
    if special_keys == [91, 49, 52, 126]: 
     sys.stdout.write('F4\n') 

@pbuckからの提案に基づいて、私は自分の端末をテストし、上記の結果を列挙しました。このソリューションが移植可能かどうかはわかりません。 @pbuckはESCの後に次の2つのキーを使うべきだと提案して以来。私の場合は、次の4つのキーを抽出する必要があります。

+0

F1などを検出できない場合は、 'TERM'が正しく設定されていないためです。 –

+0

@ThomasDickeyので、私は正しいTERMを使用する必要があります。私が正しいTERMを知っていたら、私はここに質問を投稿しません。 – q0987

+0

異なる端末では、** 'TERM' **の値が異なっている必要があります(あなたの質問はあなたが使っている端末を示していません)。 –

答えて

-1

ファンクションキーは、端末によってマッピングされます。たとえば、F1キーを押すと、実際にEsc-OP(好きな場合は^[OP)のようなシーケンスを端末が送信している可能性があります。したがって、stdscr.getch()にある場合、それがEscであれば、次の数文字をつかみFKEYで決定します。

特定のエスケープシーケンスは大したものではありませんが、ファンクションキーシーケンスはインターフェイス(つまり、xterm、コンソール、ターミナルウィンドウなど)に依存します。 * nixでは、通常はterminfoデータベースを意味します。いくつかのインタフェース(私のemacs シェルのような)では、端末ドライバがそれを傍受するので何も送られません!

あなたはので、tputcat -Aを使用して特定のインターフェイスためを送信されているものを決定することができます。

:コンソールウィンドウの利回りを使用して、同じコンピュータと私の場合には、しかし

$ tput kp1 | cat -A 
^[OP 
$ tput kp10 | cat -A 
^[[21~ 

$ tput kp1 | cat -A 
^[[21~ 
$ tput kp10 | cat -A 
^[[[A 
+0

最新の投稿を確認してください。 – q0987

+0

@ q0987私のポストをより多くの例で更新してください。 – pbuck

+0

は、この回答が投票された理由を入力していただければ幸いです。 – pbuck

関連する問題