Input in a Python text-based GUI (TUI)

Adding another option few years after original question. As per the author of Picotui:

Picotui is a Text User Interface (TUI) widget library for Python3. It is known to work with CPython3 and Pycopy (Unix version is officially supported for the latter), but should work with any Python3 implementation which allows to access stdin/stdout file descriptors.

The author also goes on to compare PicoTUI against Urwid. Some interesting points there. I am hoping to use PicoTUI for a project I am looking to start. Admittedly, no first hand experience. Came across this question when looking for answers for my TUI (Text-based UI or Terminal-based UI, much in GUI sense) Python library, so thought of adding this option.


Also try useful built atop curses high level framework urwid. With that thing you could do rich and colorful interfaces. Buttons, edit fields, even status bars and progress bars and all that you need. To start working you only need Python curses installed and urwid folder with its sources (you can transfer whole urwid library with your application as standalone bundle!). It works even under cygwin under Windows XP/7 where is, as we know, no curses ports for Python.

urwid portfolio

No more lowlevel, sometimes very boring curses :)


What you need for this sort of text UI is a terminal library that understands the basic layout and capabilities of your screen and the supported input devices.

On Linux (or OSX), the widely recognised standard is ncurses. Python provides a module to wrap this native library. However, this (and any package that uses this - e.g. urwid) are of limited use on Windows.

In your case, you need to use something else that provides access to the native Win32 console API. That would either be cygwin, a custom install of PDcurses, or a package like pywin32.

Alternatively, if you really don't want to worry about all that OS specific nonsense, you could just install asciimatics. This provides a cross-platform API to place text anywhere on the screen and process keyboard input. In addition, it provides higher level widgets to create text UIs like this:

Text UI widgets

Full disclosure: Yes - I am the author of this package.