Skip to main content

A simple program that allows users to make their terminal reactive to keypresses

Project description

onkeypress

Allows users to make terminal react to keypresses

installation

pip install onkeypress

quickstart

from onkeypress import while_not_exit, onkeypress, Key

def print_up():
    print("up is pressed")

def print_down():
    print("down is pressed")

while_not_exit(
    onkeypress(Key.UP).call(print_up),
    onkeypress(Key.DOWN).call(print_down),
    exit_key=Key.ENTER,
)
key pressed printed text
Up up is pressed
Down down is pressed

If you hit Enter (or Control-C), the program exits

A slightly harder example using .args(*args) and .kwargs(**kwargs)

from onkeypress import while_not_exit, onkeypress, Key

def myfunc(*args, **kwargs):
    print(f"{args=} {kwargs=}")

while_not_exit(
    onkeypress(Key.UP).call(myfunc).args("up"),
    onkeypress(Key.DOWN).call(myfunc).kwargs(key="down"),
    onkeypress("a").call(myfunc).args("a").kwargs(key="a"),
    onkeypress("s").call(myfunc).args("s", "s").kwargs(key="s", val="s"),
    exit_key=Key.ENTER,
)
key pressed printed text
Up args=('up',) kwargs={}
Down args=() kwargs={'key': 'down'}
a args=('a',) kwargs={'key': 'a'}
s args=('s', 's') kwargs={'key': 's', 'val': 's'}

We can use Key.ALL_OTHERS to match all other keys

from onkeypress import while_not_exit, onkeypress, Key
import random

def print_1_to_5_chars(char: str):
    if char.isalnum():
        print(char * random.randrange(1, 5), end="")
    else:
        print(char, end="")

while_not_exit(
    onkeypress(Key.ALL_OTHERS).call(print_1_to_5_chars),
    exit_key=Key.CONTROL_C,
)

Key.ALL_OTHERS match all other keys which were not declared

^ when we type a letter, it randomly repeats itself 1-5 times

More advanced example: Arrow keys to move "X" around in 6x6 board

from onkeypress import while_not_exit, onkeypress, Key
from copy import deepcopy
from unprint import unprint

BOARD = [["-"]*6 for _ in range(6)]

def print_board(board: list, user_row: int, user_col: int):
    board = deepcopy(board)
    board[user_row][user_col] = "X"
    [print(*row, sep=" ") for row in board]
    print()

print_board(BOARD, 0, 0)

state = {"row":0 , "col": 0}

def handle_keypress(row_diff: int, col_diff: int, state: dict):
    new_row = state["row"] + row_diff
    new_col = state["col"] + col_diff
    if new_row not in range(6) or new_col not in range(6):
        return
    state["row"], state["col"] = new_row, new_col
    unprint(7)
    print_board(BOARD, new_row, new_col)

while_not_exit(
    onkeypress(Key.UP).call(handle_keypress).args(-1, 0, state),
    onkeypress(Key.DOWN).call(handle_keypress).args(1, 0, state),
    onkeypress(Key.LEFT).call(handle_keypress).args(0, -1, state),
    onkeypress(Key.RIGHT).call(handle_keypress).args(0, 1, state),
    exit_key=Key.CONTROL_C,
)

Note - try hitting your arrow keys. Notice that your "X" moves around

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

onkeypress-0.0.4.tar.gz (4.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

onkeypress-0.0.4-py3-none-any.whl (4.5 kB view details)

Uploaded Python 3

File details

Details for the file onkeypress-0.0.4.tar.gz.

File metadata

  • Download URL: onkeypress-0.0.4.tar.gz
  • Upload date:
  • Size: 4.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.12.3

File hashes

Hashes for onkeypress-0.0.4.tar.gz
Algorithm Hash digest
SHA256 c5cddf7dde828a3260311528614fa1e60f0e9892926be3401fbfa3cc9b445e57
MD5 10de0f3010157e1abc5801496d2c8164
BLAKE2b-256 00abea564e7944a7ad429797a3c18657e4ef82e7e194c8acf6bb68aea151ae00

See more details on using hashes here.

File details

Details for the file onkeypress-0.0.4-py3-none-any.whl.

File metadata

  • Download URL: onkeypress-0.0.4-py3-none-any.whl
  • Upload date:
  • Size: 4.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.12.3

File hashes

Hashes for onkeypress-0.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 cc9342acb24318bcab81da1c2b14a05648fbd4b5a4ff50fac0f2a89c20b43f59
MD5 072103fad589d998b37eb364bab44fc2
BLAKE2b-256 a08c530ae21e2a41f385a6a6ab127b44f2875949a2c96c08493a06782229ed04

See more details on using hashes here.

Supported by

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