Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Input in a Python text-based GUI (TUI)

I have been trying to make my own UI that is text-based in python 2.7, but I thought of an idea about input. So I figured something like this: input = raw_input("|" + "input: ".center(78) + "|"), but of coarse, the cursor is way far on the right (just realized it wouldn't work before i even typed it in :P). So, the question is, is how do I put an input in the middle of the screen with text on the same line (on both sides) and have the cursor type after I write "Input: "? And if your wondering, im using this:

if True:
    print c + "Hi! This is a text-based GUI!".center(78, h) + c
    print c + "-" * 78 + c
    print v + "OPTIONS".center(78) + v
    print c + "-" * 78 + c
    print v + "1 - Quit".center(78) + v
    for i in range(1, 7):
        print v + " " * 78 + v
    print c + "-" * 78 + c

in the interpreter and it looks decent:

+------------------------Hi! This is a text-based GUI!-------------------------+
+------------------------------------------------------------------------------+
|                                   OPTIONS                                    |
+------------------------------------------------------------------------------+
|                                   1 - Quit                                   |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
+------------------------------------------------------------------------------+

Note: I use Windows XP

like image 496
Cold Diamondz Avatar asked Aug 11 '13 22:08

Cold Diamondz


3 Answers

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.

like image 165
Peter Brittain Avatar answered Oct 12 '22 20:10

Peter Brittain


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.

like image 40
bdutta74 Avatar answered Oct 12 '22 19:10

bdutta74


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

like image 38
rook Avatar answered Oct 12 '22 19:10

rook