如何在ncurses屏幕中输入单词?

7
我曾经尝试使用raw_input()函数,但发现它与ncurses不兼容。之后我尝试了window.getch()函数,虽然可以在屏幕上输入和显示字符,但无法实现输入。如何在ncurses中输入一个单词,并使用if语句对其进行评估?
例如,我想在ncurses中实现以下内容:
import ncurses
stdscr = curses.initscr()

# ???_input = "cool" # this is the missing input method I want to know
if ???_input == "cool":
    stdscr.addstr(1,1,"Super cool!")
stdscr.refresh()
stdscr.getch()
curses.endwin()
1个回答

21

raw_input()函数在curses模式下无法使用,getch()方法返回一个整数,代表所按键的ASCII码,如果你想要从提示中扫描字符串将不起作用。您可以使用getstr函数:

window.getstr([y, x])

读取用户输入的字符串,具有原始行编辑功能。

用户输入

还有一种方法可以检索整个字符串,即getstr()方法。

curses.echo()            # Enable echoing of characters

# Get a 15-character string, with the cursor on the top line
s = stdscr.getstr(0,0, 15)

我编写的 raw_input 函数如下:

def my_raw_input(stdscr, r, c, prompt_string):
    curses.echo() 
    stdscr.addstr(r, c, prompt_string)
    stdscr.refresh()
    input = stdscr.getstr(r + 1, c, 20)
    return input  #       ^^^^  reading input at next line  

将其称为choice = my_raw_input(stdscr, 5, 5, "cool or hot?")

编辑:这是一个可行的示例:

if __name__ == "__main__":
    stdscr = curses.initscr()
    stdscr.clear()
    choice = my_raw_input(stdscr, 2, 3, "cool or hot?").lower()
    if choice == "cool":
        stdscr.addstr(5,3,"Super cool!")
    elif choice == "hot":
        stdscr.addstr(5, 3," HOT!") 
    else:
        stdscr.addstr(5, 3," Invalid input") 
    stdscr.refresh()
    stdscr.getch()
    curses.endwin()

输出:

在此输入图片描述


两个问题。在“input = stdscr.getstr(r + 1, c, 20)”中,为什么我要从r+1读取?(因为光标会自动移动到那里吗?)r+1和c之后的“20”是什么意思? - Mario
@Mario(1)我执行了r + 1以将光标移动到下一行(因为在执行?后光标会自动移动到下一行)。 - Grijesh Chauhan
"20" 表示您可以输入 20 个字符的字符串。请阅读我在答案中添加的所有评论和文档。 - Grijesh Chauhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接