【问题标题】:Enter key not recognized with curses输入键无法被诅咒识别
【发布时间】:2021-04-24 15:45:05
【问题描述】:

我有这个示例代码,如果按下 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)

【问题讨论】:

  • 也许先用print(Key, curses.KEY_ENTER)看看你按键后得到了什么,然后和curses.KEY_ENTER比较。也许您必须将Key 与不同的值进行比较——也许是一些KEYPAD_ENTER。或者 getkey() 不是为 ENTER 创建的
  • 在装有 Linux 的计算机上,我必须使用 if Key == '\n':if ord(Key) == 10:
  • “但由于某种原因我不想使用它们”——这是为什么呢?
  • @martineau 我测试了它,getch() 总是给出关键代码(整数),所以你必须与ord("a")97 进行比较。使用getkey(),您可以直接与"a" 进行比较。但更好的是get_wch() - 它还提供"a" 而不是97,并且只有get_wch 与本机字符一起使用。我在答案中添加了测试代码。

标签: python python-3.x curses python-curses


【解决方案1】:

在我的 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(和普通键的char)-但它仍然将ENTER 视为'\n'


你应该简单地使用print() 来检查你在变量中得到了什么。

print(Key, type(Key))

当你看到它是<class str>

print( ord(Key) )

您也可以将其与常量进行比较

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

编辑:

我在 Mate-Terminal 中的 Linux Mint 20 MATE、Python 3.8 上使用此代码对其进行了测试。

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
    

【讨论】:

  • 是的,感谢我使用 '\n' 的精彩解释,它的工作原理非常好,谢谢
  • 顺便说一句,我如何使用这种方法读取 f1 - f12 键?
  • 如果你运行我的代码并按下F1,那么你会看到key: <class 'int'> 265 keyname: KEY_F(1)。如果您使用getkey(将特殊键作为字符串发送),那么您必须与字符串getkey() == "KEY_F(1)" 进行比较,如果您使用getchget_wch(将特殊键作为整数发送),那么您必须与整数进行比较get_wch() == 265 但你也可以使用 get_wch() == curses.KEY_F1
  • 是的,它可以工作,但我不知道为什么当我使用其他终端时它不能在我的库存终端上工作,它工作得很好
  • 我很久以前就知道有许多不同的终端(硬件)和当前的终端(软件)可以模拟不同的版本。当您按F1 时,您可以使用我的程序查看代码。也许它有助于查看您必须在程序中使用哪些代码。
猜你喜欢
  • 1970-01-01
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
  • 2018-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多