诅咒无法识别输入键
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)"
整数 265
或 curses.KEY_F1
对于 get_wch()
和 getch()
get_wch() == 265
get_wch() == curses.KEY_F1
getch() == 265
getch() == curses.KEY_F1
我有这个示例代码,如果按下 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)"
整数
265
或curses.KEY_F1
对于get_wch()
和getch()
get_wch() == 265 get_wch() == curses.KEY_F1 getch() == 265 getch() == curses.KEY_F1