诅咒无法识别输入键

Enter key not recognized with curses

我有这个示例代码,如果按下 enter 键,我会在屏幕上书写,但是当我 运行 时,代码没有任何反应,也没有任何内容写入屏幕。 我知道我可以使用 stdscr.getch(),但出于某种原因我不想使用它们。

import curses

def main(stdscr):
    stdscr.keypad(True)
    while 1:
        Key = stdscr.getkey()
        if Key == curses.KEY_ENTER:
            stdscr.addstr(0,0,'u pressed enter')
            stdscr.refresh()

curses.wrapper(main)

在我的电脑上 Linux 我必须使用

if Key == '\n': 

if ord(Key) == 10:

似乎 getkey() 没有将 ENTER 视为特殊键,return curses.KEY_ENTER 也没有。或者可能取决于终端 - 其中一些可能可以选择为 ENTER and/or BACKSPACE.

定义代码

编辑:

我发现对于特殊键 getkey() 会给我类似 "KEY_LEFT" 的字符串,而不是整数值 curses.KEY_LEFT。但是 get_wch() 给出整数值 curses.KEY_LEFT (和普通键的字符) - 但它仍然将 ENTER 视为 '\n'


你应该简单地使用 print() 来检查你得到的变量。

print(Key, type(Key))

当你看到它时 <class str>

print( ord(Key) )

你也可以将它与常量进行比较

print( Key, curses.KEY_ENTER, Key == curses.KEY_ENTER )

编辑:

我在 Linux Mint 20 MATE,Python 3.8,Mate-Terminal 上用这段代码测试了它。

import curses

def main(stdscr):

    while True:
        #key = stdscr.getch()     # always integer (keycode), native/Polish char WRONG (two wrong integers)
        #key = stdscr.getkey()    # char or string (keyname), native/Polish char WRONG (two wrong chars)
        key = stdscr.get_wch()   # char or integer (keycode), native/Polish char OK
        
        print('key:', type(key), key, end='\n\r')
        
        if isinstance(key, str):
            print('len:', len(key), end='\n\r')
            if len(key) == 1:            
                print('ord:', ord(key), end='\n\r')
        else:
            print('keyname:', curses.keyname(key), end='\n\r')

        print('---', end='\n\r')

        stdscr.refresh()

# --- main ---

#print('curses.KEY_ENTER:', curses.KEY_ENTER)
#print('curses.KEY_BACKSPACE:', curses.KEY_BACKSPACE)

curses.wrapper(main)

对我来说最好的是 get_wch(),因为它可以正确处理本地(波兰语)字符。

getch()   - always integer (keycode),  native/Polish char WRONG (two wrong integers)
getkey()  - char or string (keyname),  native/Polish char WRONG (two wrong chars)
get_wch() - char or integer (keycode), native/Polish char OK
        

编辑:

对于密钥F1,它需要

  • 字符串 "KEY_F(1)" 对于 getkey()

    getkey() == "KEY_F(1)"
    
  • 整数 265curses.KEY_F1 对于 get_wch()getch()

    get_wch() == 265
    get_wch() == curses.KEY_F1
    
    getch() == 265
    getch() == curses.KEY_F1