【问题标题】:how to detect F1-F12 within python curses如何在 python 诅咒中检测 F1-F12
【发布时间】:2019-07-05 21:24:20
【问题描述】:
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。

问题>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 之后使用接下来的两个键。就我而言,我必须提取接下来的四个键。

【问题讨论】:

  • 如果无法检测到F1等,那是因为TERM设置错误。
  • @ThomasDickey,那么我应该使用什么正确的术语。如果我知道正确的 TERM,我不会在这里发布问题。
  • 不同的终端需要不同的TERM值(你的问题没有说明你使用的是哪个终端)。

标签: python python-3.x curses


【解决方案1】:

这种方式能满足你的需要吗?

nKey = stdscr.getch()
sKeys = "%d" % nKey
if nKey == 27 :
    stdscr.nodelay(True)
    for n in range(0,10):
        nKey = stdscr.getch()
        if nKey == curses.ERR :
            break
        sKeys += " %d" % nKey
    stdscr.nodelay(False)
print ( "Key : %s" % sKeys )

如下图所示:

[F1]    "27 91 49 49 126"
[F2]    "27 91 49 50 126"
[HOME]  "27 91 49 126"
[END]   "27 91 52 126"

这是一种直观地查看结果的简单方法,但是对于稍后的 if 语句,使用列表变量可能会很容易。 它延迟 [ESC] 键。我发现这个 post 来改变它的行为。

--追加-- 这样做可以避免 [ESC] 的延迟,但它会影响许多键码和鼠标输入。

stdscr.keypad(False)

【讨论】:

    【解决方案2】:

    功能键由您的终端映射。例如,当您按下 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
    

    【讨论】:

    • @q0987 更新我的帖子,提供更多示例,希望对您有所帮助。
    • 欢迎就为什么这个答案被否决的原因提供意见——也许我可以做得更好。
    猜你喜欢
    • 2018-05-08
    • 2014-04-17
    • 2014-04-23
    • 2012-04-08
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2021-08-15
    相关资源
    最近更新 更多