如果按下 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)
答案 0 :(得分: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
(普通键的字符和字符) - 但它仍然将 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