2017-06-01 66 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.html如何檢測蟒詛咒

上面的代碼可以被用於檢測 'Q' 和arrow_up內F1-F12。但是,它不能用於檢測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之後使用下兩個鍵。對於我的情況,我必須提取下四個鍵。

+0

如果你無法檢測到F1等,這是因爲你有'TERM'設置不正確。 –

+0

@ThomasDickey,那麼我應該使用什麼正確的TERM。如果我知道正確的TERM,我不會在這裏發表問題。 – q0987

+0

不同的終端需要**'TERM' **的不同值(你的問題沒有說明你正在使用哪個終端)。 –

回答

-1

功能鍵由終端映射。例如,當您按下F1鍵時,終端(可能)實際上正在發送一個序列,如Esc-OP(如果您願意,可以輸入^[OP)。因此,在stdscr.getch()上,如果是Esc,則抓住接下來的幾個字符以使用FKEY確定。

對特定轉義序列進行硬編碼並不是很好,但功能鍵序列取決於接口(即,您的xterm,控制檯,終端窗口等)。對於* nix,通常意味着terminfo數據庫。在一些接口上(比如我的emacs shell),因爲終端驅動程序攔截它而沒有發送任何消息!

您可以確定什麼被髮送使用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