7

I was trying to use raw_input() function first, but find it in compatible with ncurses.
Then I tried window.getch() function, I can type and show characters on screen, but can't realize input. How can I input a word in ncurses and can use if statement to evaluate it?

For example, I wanna realize this in 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()
Grijesh Chauhan
  • 57,103
  • 20
  • 141
  • 208
Mario
  • 921
  • 2
  • 10
  • 22

1 Answers1

21

Function raw_input( ) doesn't works in curses mode, The getch() method returns an integer; it represents the ASCII code of the key pressed. The will not work if you wants to scan string from prompt. You can make use of getstr function:

window.getstr([y, x])

Read a string from the user, with primitive line editing capacity.

User Input

There’s also a method to retrieve an entire string, 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)

And I wrote raw_input function as below:

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  

call it as choice = my_raw_input(stdscr, 5, 5, "cool or hot?")

Edit: Here is working example:

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()

output:

enter image description here

Grijesh Chauhan
  • 57,103
  • 20
  • 141
  • 208
  • Two questions. In "input = stdscr.getstr(r + 1, c, 20)" Why should I read from r+1?(Beacuse the curosr automatically move to there?) What does the "20" mean after r+1 and c? – Mario Feb 16 '14 at 02:12
  • @Mario (1) I did `r + 1` to move cursor to *next row*, (because courser will automatically move to next after `?`) – Grijesh Chauhan Feb 16 '14 at 05:01
  • "20" means you can input 20 chars string. Read all comments and doc I add in answer – Grijesh Chauhan Feb 16 '14 at 05:02