2017-06-01 135 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