输入键不能被诅咒识别

问题描述

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

import curses

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

curses.wrapper(main)

解决方法

在我使用 Linux 的计算机上,我必须使用

if Key == '\n': 

if ord(Key) == 10:

似乎 getkey() 不会将 ENTER 视为特殊键,也不会返回 curses.KEY_ENTER。或者它可能取决于终端 - 其中一些可能可以选择为 ENTER 和/或 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