Skip to main content

No project description provided

Project description

terminable

Python library for cross-platform terminal input.

  • Tested on Windows and macOS, probably works on Linux (not tested yet)
  • Does not require root access
  • Provides keyboard, mouse, and terminal-resize events
  • Simple API that you can plug into your own event loop
  • Does not require a full-screen terminal app or separate window

Install

python3 -m pip install terminable

Usage

import terminable

with terminable.capture_input() as terminal_input:
    while True:
        returned_value = terminal_input.read()
        print(f"Input received: {returned_value}\r")

Sample output:

Input received: KeyEvent(Char(a), KeyModifiers.NONE)
Input received: KeyEvent(Char(s), KeyModifiers.NONE)
Input received: KeyEvent(Char(A), KeyModifiers.SHIFT)
Input received: KeyEvent(Char(S), KeyModifiers.SHIFT)
Input received: KeyEvent(Char(F), KeyModifiers.SHIFT)
Input received: KeyEvent(Key.F1, KeyModifiers.NONE)
Input received: KeyEvent(Key.F3, KeyModifiers.NONE)
Input received: KeyEvent(Key.F2, KeyModifiers.NONE)
Input received: KeyEvent(Char(l), KeyModifiers.CONTROL)
Input received: KeyEvent(Char(k), KeyModifiers.CONTROL)
Input received: KeyEvent(Char(p), KeyModifiers.CONTROL)
Input received: MouseEvent(MouseEventKind.MOVED, None, 54, 20, KeyModifiers.NONE)
Input received: MouseEvent(MouseEventKind.MOVED, None, 53, 20, KeyModifiers.NONE)
Input received: MouseEvent(MouseEventKind.MOVED, None, 52, 20, KeyModifiers.NONE)
Input received: MouseEvent(MouseEventKind.MOVED, None, 51, 20, KeyModifiers.NONE)
Input received: MouseEvent(MouseEventKind.MOVED, None, 54, 19, KeyModifiers.NONE)
Input received: MouseEvent(MouseEventKind.SCROLL_DOWN, None, 54, 19, KeyModifiers.NONE)
Input received: MouseEvent(MouseEventKind.SCROLL_DOWN, None, 54, 19, KeyModifiers.NONE)
Input received: MouseEvent(MouseEventKind.SCROLL_DOWN, None, 54, 19, KeyModifiers.NONE)
Input received: MouseEvent(MouseEventKind.SCROLL_DOWN, None, 54, 19, KeyModifiers.NONE)
Input received: ResizeEvent(104, 31)
Input received: ResizeEvent(100, 31)
Input received: ResizeEvent(98, 31)
Input received: ResizeEvent(95, 31)

Types of input

  • Keyboard
    • Characters
    • Arrow keys
    • Function keys
    • Enter, Esc, Backspace, etc.
    • Modifiers: CONTROL, SHIFT, ALT, etc.
  • Mouse
    • Move
    • Down
    • Up
    • Drag
    • Scroll (scroll wheel, trackpad scroll gestures)
  • Resize of terminal window

Implementation

terminable is a thin Python wrapper around the excellent crossterm Rust library.

crossterm does all the heavy lifting. terminable exposes a small subset of crossterm functionality to Python using PyO3.

API

capture_input

terminable has a single function:

def capture_input() -> InputCapture:
    ...

InputCapture

The InputCapture object is a context manager object (intended to be used with Python's with statement).

When the InputCapture object is created, the terminal is placed into raw mode, such that:

  • Input is not automatically echoed
  • print calls do not automatically add a carriage return (\r)
  • Control sequences are not automatically processed

When the InputCapture object is destroyed, the terminal exits raw mode.

read

InputCapture has a single function:

def read(self) -> KeyEvent | MouseEvent | ResizeEvent:
    ...

read blocks until input is received.

Ctrl+C

terminable raises a KeyboardInterrupt exception on Ctrl+C.

Comparison with other libraries

There are other existing libraries for getting terminal input in Python, but each of them have their limitations:

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

terminable-0.1.1.tar.gz (9.4 kB view hashes)

Uploaded Source

Built Distributions

terminable-0.1.1-cp310-none-win_amd64.whl (162.6 kB view hashes)

Uploaded CPython 3.10 Windows x86-64

terminable-0.1.1-cp310-cp310-manylinux_2_34_x86_64.whl (287.4 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.34+ x86-64

terminable-0.1.1-cp310-cp310-macosx_11_0_arm64.whl (239.3 kB view hashes)

Uploaded CPython 3.10 macOS 11.0+ ARM64

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page