Skip to content

Simpler abstraction for terminal I/O on Unix and Windows

License

Notifications You must be signed in to change notification settings

loganzartman/termpixels

Repository files navigation

termpixels

the terminal as a character-cell matrix

Build Status Code Coverage

Get it

This project is on PyPI: pip install --pre termpixels

(Use prerelease versions until 1.0.0!)

Alternatively, clone this repository and pip install -e . in the root directory.

Requires Python 3, and no dependencies*!

* Requires pytest to run tests

Purpose

Creating programs that run inside of terminals seems convoluted. The goal of termpixels is to abstract the terminal into a 2D array of "pixels", or character cells, which each contain a single text character, a foreground color, and a background color. termpixels allows you to modify the screen contents anywhere, at any time, and then handles updating the terminal automatically, as well as simplifying complicated terminal input processing.

Ultimately, this project seeks to make the terminal more accessible and more fun.

Limitations

There are lots of great libraries for coloring terminal output. This one is designed for full-screen applications that completely control the contents of the screen. That means that it, e.g., automatically saves and clears the screen, resets the cursor position, and accepts input in cbreak mode.

It's not the best solution for simply printing colored text, though you can do that if you want.

Recently, it has come to my attention that some people use proportional fonts in their terminals. This library assumes that your terminal is displaying a monospaced font.

Demo

Demo gif

from termpixels import App, Color
from time import time
from math import sin

a = App()

@a.on("frame")                                 # run this function every frame
def frame():
    a.screen.clear()                           # remove everything from the screen
    text = "Hello world, from termpixels!"

    for i, c in enumerate(text):
        f = i / len(text)
        color = Color.hsl(f + time(), 1, 0.5)  # create a color from a hue value
        x = a.screen.w // 2 - len(text) // 2   # horizontally center the text
        offset = sin(time() * 3 + f * 5) * 2   # some arbitrary math
        y = round(a.screen.h / 2 + offset)     # vertical center with an offset
        a.screen.print(c, x + i, y, fg=color)  # draw the text to the screen buffer

    a.screen.update()                          # commit the changes to the screen

if __name__ == "__main__":
    a.run()                                    # block here until the app exits (press Escape!)

More demos

Features

  • Unix (and Mac) terminal feature detection with terminfo (via Python curses)
  • Windows support through Win32 Console API
  • Terminal (re)size detection
  • Asynchronous input
    • Keyboard input with support for special keys like arrows, function keys, escape, etc.
    • Mouse click, scroll and move input in terminals supporting xterm mouse
  • 16, 256, and true color output (with detection for best supported mode)
  • Display the cursor anywhere (or hide it!)
  • Preserves the state of the user's terminal using alternate screen buffer.
  • Rudimentary support for fullwidth characters.
  • No reliance on ncurses except for terminfo lookup
  • 100% Python
  • and more

Inspiration

Releases

No releases published

Packages

No packages published

Languages