have you checked the python curses howto already? I have written a curses wrapper for one of my projects. Maybe it can help showing what steps you need. I've been using curses a lot for my own projects so feel free to ask me if there's something you want to know. The python curses library is mostly just a wrapper around calls to the ncurses system library. Documentation for that library or ports in other languages will likely help you in python too. Answer from troido on reddit.com
๐ŸŒ
Python documentation
docs.python.org โ€บ 3 โ€บ howto โ€บ curses.html
Curses Programming with Python โ€” Python 3.14.4 documentation
Author, A.M. Kuchling, Eric S. Raymond,, Release, 2.04,. Abstract: This document describes how to use the curses extension module to control text-mode displays. What is curses?: The curses library ...
๐ŸŒ
Python
docs.python.org โ€บ 3 โ€บ library โ€บ curses.html
curses โ€” Terminal handling for character-cell displays
Source code: Lib/curses The curses module provides an interface to the curses library, the de-facto standard for portable advanced terminal handling. While curses is most widely used in the Unix en...
Discussions

user interface - Are there any toolkit libraries for curses with Python bindings? - Stack Overflow
Urwid is the best library to work with curses and python that I know. More on stackoverflow.com
๐ŸŒ stackoverflow.com
windows - What is needed for curses in Python 3.4 on Windows7? - Stack Overflow
I have a running Python 2.7/3.4 installation on my Windows 7 (x64) machine. I would like to test curses on Windows. Curses is installed but not working: >>> import curses Traceback (most More on stackoverflow.com
๐ŸŒ stackoverflow.com
Does python have a curses lib that looks THIS good?
Well it turns out my search abilities lacked on my first attempt. I just found this same question asked already. https://www.reddit.com/r/Python/comments/5tjyag/are_there_any_equivalents_to_blessed_a_js_cli_ui/ More on reddit.com
๐ŸŒ r/Python
2
12
February 2, 2018
Any examples of slick curses user interfaces built with Python? (post screenshots please!)
you should check out blessed . It's based on blessings . Which has a slick progress bar written for it called progressive . More on reddit.com
๐ŸŒ r/Python
11
38
September 22, 2015
๐ŸŒ
Reddit
reddit.com โ€บ r/roguelikedev โ€บ any python/curses resources?
r/roguelikedev on Reddit: Any Python/Curses resources?
May 10, 2021 -

I know curses is generally disliked around here, and tcod is recommended. I've tried to get tcod working on two operating systems though, and couldn't get it to work on either. I haven't tried really hard though, because curses really appeals to me, both by being the traditional library used for most of the roguelikes I played growing up, and also because of the small footprint when it comes to system resources.

There aren't many Python/Curses resources out there. I've found a few non-roguelike-specific tutorials on youtube, the Rogue Detective source, and this non-functional algorithm. I'm pretty sure this is enough for me to cobble together something playable. I'm just curious whether there are better methods I could be using.

๐ŸŒ
W3Schools
w3schools.com โ€บ python โ€บ ref_module_curses.asp
Python curses Module
Python Examples Python Compiler ... Certificate Python Training ... The curses module provides terminal handling for character-cell displays, supporting text UIs....
๐ŸŒ
PyPI
pypi.org โ€บ project โ€บ windows-curses
windows-curses ยท PyPI
Adds support for the standard Python curses module on Windows. Based on these wheels.
      ยป pip install windows-curses
    
Published ย  Mar 31, 2026
Version ย  2.4.2
๐ŸŒ
Substack
codedrome.substack.com โ€บ p โ€บ an-introduction-to-curses-in-python
An Introduction to curses in Python - CodeDrome - Substack
May 20, 2025 - In a few of my projects I have used various ANSI terminal codes to manipulate terminal output, specifically moving the cursor around and changing text colours. These codes are often cryptic, can be cumbersome if used extensively, and cannot be relied upon to work across different platforms. A better solution is to use Python's implementation of the venerable curses library, and in this post I will provide a short introduction to what I consider its core functionalities: moving the cursor around and printing in different colours.
๐ŸŒ
DZone
dzone.com โ€บ coding โ€บ languages โ€บ python curses, part 1: drawing with text
Python curses, Part 1: Drawing With Text
April 21, 2025 - Discover how to draw with text using the Python curses library. Learn setup, key considerations and how to create basic framework for your application.
Find elsewhere
๐ŸŒ
GitHub
gist.github.com โ€บ claymcleod โ€บ b670285f334acd56ad1c
Python curses example ยท GitHub
import curses def draw_menu(stdscr): k = 0 kw = 0 kk = "" height, width = stdscr.getmaxyx() min_x_keystr = width - 1 min_x_wkeystr = width - 1 min_x_kkeystr = width - 1 cursor_x = 0 cursor_y = 0 # Clear and refresh the screen for a blank canvas stdscr.clear() stdscr.refresh() # Start colors in curses curses.start_color() curses.init_pair(1, curses.COLOR_CYAN, curses.COLOR_BLACK) curses.init_pair(2, curses.COLOR_RED, curses.COLOR_BLACK) curses.init_pair(3, curses.COLOR_BLACK, curses.COLOR_WHITE) # Loop where k is the last character pressed while (k != ord('q')): # Initialization #stdscr.clear()
๐ŸŒ
Python
docs.python.org โ€บ 3.12 โ€บ howto โ€บ curses.html
Curses Programming with Python โ€” Python 3.12.12 documentation
Author, A.M. Kuchling, Eric S. Raymond,, Release, 2.04,. Abstract: This document describes how to use the curses extension module to control text-mode displays. What is curses?: The curses library ...
๐ŸŒ
DevDungeon
devdungeon.com โ€บ content โ€บ curses-programming-python
Curses Programming in Python | DevDungeon
June 10, 2019 - The `curses` and `ncurses` (new curses) libraries go back to 1980's and 90's and provide an API to create textual user interfaces (TUI). If you write a command-line application, you should consider using curses to implement functionality you ...
๐ŸŒ
GitHub
github.com โ€บ zephyrproject-rtos โ€บ windows-curses
GitHub - zephyrproject-rtos/windows-curses: Windows Curses Python module ยท GitHub
This is the repository for the windows-curses wheels on PyPI. The wheels are based on the wheels on Christoph Gohlke's page. Only build-wheels.bat is original work. Wheels built from this repository can be installed with this command: ... Starting with version 2.0, these wheels include a hack to make resizing work for Python applications that haven't been specifically adapted for PDCurses.
Starred by 213 users
Forked by 39 users
Languages ย  C
๐ŸŒ
Gnosis
gnosis.cx โ€บ publish โ€บ programming โ€บ charming_python_6.html
CHARMING PYTHON #6 -- Curses programming in Python: Tips for Beginners --
Python is available for almost every computer platform you might find yourself working on, and has strong portability between platforms. curses (usually ncurses in practice) is a library whose routines give a programmer a terminal-independent method of controlling character screens.
๐ŸŒ
Python
docs.python.org โ€บ 3.5 โ€บ howto โ€บ curses.html
Curses Programming with Python โ€” Python 3.5.10 documentation
This document is for an old version of Python that is no longer supported. You should upgrade, and read the Python documentation for the current stable release. ... This document describes how to use the curses extension module to control text-mode displays.
๐ŸŒ
DZone
dzone.com โ€บ coding โ€บ languages โ€บ python curses, part 3: working with windowed content
Python curses, Part 3: Working With Windowed Content
April 23, 2025 - Explore window customization, content updates, window size management, and CPU optimization with Python's curses module for efficient terminal interfaces.
๐ŸŒ
Hyperskill
hyperskill.org โ€บ blog โ€บ post โ€บ introduction-to-the-curses-library-in-python-text-based-interfaces
Introduction to the curses Library in Python: Text-Based Interfaces | Hyperskill Blog
October 24, 2024 - `curses` is a simple yet effective library for creating text-based UIs. It has some quirks, like throwing errors if the text is out of bounds. Some functionality may depend on your system or even the terminal you use.
Top answer
1 of 3
12

Urwid is the best library to work with curses and python that I know.

Altenatively, you might find also interesting snack (newt-based library).

For more information, please have a look at this question.

2 of 3
9

npyscreen

Npyscreen is a Python widget library and application framework for programming terminal or console applications. It is built on top of ncurses, which is part of the standard library.

The focus of this library is to provide a rapid way to develop console applications. In general, adding a control to the screen requires only one line of code.

This framework should be powerful enough to create everything from quick, simple programs to complex, multi-screen applications.

#!/usr/bin/env python
# encoding: utf-8

import npyscreen
class TestApp(npyscreen.NPSApp):
    def main(self):
        # These lines create the form and populate it with widgets.
        # A fairly complex screen in only 8 or so lines of code - a line for each control.
        F  = npyscreen.Form(name = "Welcome to Npyscreen",)
        t  = F.add(npyscreen.TitleText, name = "Text:",)
        fn = F.add(npyscreen.TitleFilename, name = "Filename:")
        fn2 = F.add(npyscreen.TitleFilenameCombo, name="Filename2:")
        dt = F.add(npyscreen.TitleDateCombo, name = "Date:")
        s  = F.add(npyscreen.TitleSlider, out_of=12, name = "Slider")
        ml = F.add(npyscreen.MultiLineEdit,
               value = """try typing here!\nMutiline text, press ^R to reformat.\n""",
               max_height=5, rely=9)
        ms = F.add(npyscreen.TitleSelectOne, max_height=4, value = [1,], name="Pick One",
                values = ["Option1","Option2","Option3"], scroll_exit=True)
        ms2= F.add(npyscreen.TitleMultiSelect, max_height =-2, value = [1,], name="Pick Several",
                values = ["Option1","Option2","Option3"], scroll_exit=True)

        # This lets the user interact with the Form.
        F.edit()

        print(ms.get_selected_objects())

if __name__ == "__main__":
    App = TestApp()
    App.run()