Skip to content

Instantly share code, notes, and snippets.

@myano
Created June 30, 2011 01:25
Show Gist options
  • Select an option

  • Save myano/1055442 to your computer and use it in GitHub Desktop.

Select an option

Save myano/1055442 to your computer and use it in GitHub Desktop.
Quick example of ncurses in Python!
#!/usr/bin/env python
import curses
import curses.textpad
import time
stdscr = curses.initscr()
#curses.noecho()
#curses.echo()
begin_x = 20
begin_y = 7
height = 5
width = 40
win = curses.newwin(height, width, begin_y, begin_x)
tb = curses.textpad.Textbox(win)
text = tb.edit()
curses.addstr(4,1,text.encode('utf_8'))
#hw = "Hello world!"
#while 1:
# c = stdscr.getch()
# if c == ord('p'):
# elif c == ord('q'): break # Exit the while()
# elif c == curses.KEY_HOME: x = y = 0
curses.endwin()
@qguv

qguv commented Aug 7, 2013

Copy link
Copy Markdown

This is extremely useful; thank you for posting this!

@myano

myano commented Nov 5, 2013

Copy link
Copy Markdown
Author

@qguv I'm glad this was helpful!

@ritesh

ritesh commented Dec 2, 2013

Copy link
Copy Markdown

Thank you for the example @qguv For some reason, every time I try any python curses example (both Putty and xterm) the terminal gets corrupted after i exit the program. I can no longer see what I'm typing, and commands like ls produce output without newlines. Do you know what the issue could be? This is python 2.7.3, btw.

@canibanoglu

Copy link
Copy Markdown

@riteshk, are you sure that you're calling the curses.endwin() function? Even if you are, if your code somehow exits due to an exception, your terminal will be changed because curses.endwin() will not have been called?

For this reason, it is recommended that you wrap your curses program in curses.wrapper() so that things fail gracefully.

@dldnh

dldnh commented Mar 30, 2014

Copy link
Copy Markdown

I like it without wrapper() - makes it easier to type into command-line python.

D'oh! why did I think that work work??? :-)

To get out, I just hit ^C and then pasted in the endwin() call

@yesh0907

Copy link
Copy Markdown

Thanks so much ;)

@val314159

Copy link
Copy Markdown

If your terminal gets completely hosed, you can usually run "tset" which means Terminal reSET.

@reteps

reteps commented Dec 26, 2016

Copy link
Copy Markdown

How you can avoid keyboard interrupt problems: catch it, and reset the curses variables.

def reset(screen):
    curses.nocbreak()
    screen.keypad(0)
    curses.echo()
    curses.endwin()
try:
    #your code
    #if it terminates, call `reset(screen)` here too.
except KeyboardInterrupt:
    reset(screen)
    exit()

@ice1x

ice1x commented Feb 14, 2018

Copy link
Copy Markdown

if c == ord('p'): print hw
?

@hash3liZer

Copy link
Copy Markdown

Can someone explains me the usage of curses.wrapper()? It looks pretty simple.

@chrisshroba

Copy link
Copy Markdown

Quick tip, if you exit without cleaning up and your terminal is in a wonky state, just run stty sane and it'll be good as new 😀

@Andre-Luis-Lopes-da-Silva

Copy link
Copy Markdown

When I try to use the curses. I use UBUNTU and the code returns this error:
Traceback (most recent call last):
File "/home/andre/Desktop/Python - Programas/exemplo curses.py", line 4, in
stdscr = curses.initscr()
File "/usr/lib/python3.6/curses/init.py", line 30, in initscr
fd=_sys.stdout.fileno())
_curses.error: setupterm: could not find terminal

Someone knows why this occurs?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment