Beautiful CLI prompts for Python, inspired by clack
Project description
python-clack
Beautiful CLI prompts for Python, inspired by clack.
https://github.com/user-attachments/assets/389ae92a-052a-44cb-bfe4-0fc803ef6b44
Installation
pip install python-clack
Or with uv:
uv add python-clack
Features
- Text input - Free-form text with placeholder, validation, and default values
- Select - Single selection from a list of options
- Multi-select - Multiple selection with checkboxes
- Confirm - Yes/No confirmation prompts
- Password - Masked password input
- Spinner - Animated loading indicator
- Log utilities - Styled info/success/warn/error messages
- Messages - Intro/outro banners
Try It Out
Run the interactive demo:
# With uv (recommended)
uv run python-clack-demo
# Or run examples directly
uv run python examples/basic.py
If installed globally via pip install python-clack:
python-clack-demo
Quick Start
from python_clack import intro, text, select, confirm, outro, is_cancel
intro("Welcome to my app")
name = text(
"What is your name?",
placeholder="Anonymous",
validate=lambda v: "Name is required" if not v else None
)
if is_cancel(name):
outro("Cancelled!")
exit(1)
color = select(
"Pick your favorite color",
options=[
{"value": "red", "label": "Red", "hint": "warm"},
{"value": "green", "label": "Green"},
{"value": "blue", "label": "Blue", "hint": "cool"},
]
)
confirmed = confirm("Continue?", initial_value=True)
outro("All done!")
API Reference
Prompts
text(message, **options) -> str | CANCEL
Text input prompt.
Options:
placeholder- Placeholder text when emptydefault_value- Value if user submits emptyinitial_value- Starting valuevalidate- Validation function(value) -> error_message | None
select(message, options, **kwargs) -> T | CANCEL
Single selection prompt.
Options:
options- List of{"value": T, "label": str, "hint": str, "disabled": bool}initial_value- Initially selected value
multiselect(message, options, **kwargs) -> list[T] | CANCEL
Multiple selection prompt.
Options:
options- List of option dictsinitial_values- Initially selected valuesrequired- Require at least one selection
confirm(message, **options) -> bool | CANCEL
Yes/No confirmation prompt.
Options:
active- Label for "yes" (default: "Yes")inactive- Label for "no" (default: "No")initial_value- Initial selection (default: False)
password(message, **options) -> str | CANCEL
Password input with masked characters.
Options:
mask- Character to show (default: "*")validate- Validation function
Utilities
is_cancel(value) -> bool
Check if a prompt was cancelled.
result = text("Name?")
if is_cancel(result):
print("User cancelled")
intro(title)
Display an intro banner.
outro(message)
Display an outro message.
cancel(message)
Display a cancellation message.
log
Log utilities with styled output.
from python_clack import log
log.info("Processing...")
log.success("Done!")
log.warn("Deprecation warning")
log.error("Something failed")
log.step("Step completed")
spinner()
Animated spinner for loading states.
from python_clack import spinner
import time
s = spinner()
s.start("Loading...")
time.sleep(2)
s.stop("Done!")
# Or with error/warn/cancel
s.error("Failed!")
s.warn("Warning!")
s.cancel("Cancelled!")
group(prompts, on_cancel=None)
Run multiple prompts sequentially.
from python_clack import group, text, confirm
results = group({
"name": lambda _: text("Name?"),
"email": lambda _: text("Email?"),
"confirm": lambda r: confirm(f"Create {r['name']}?"),
})
Unicode Support
python-clack automatically detects terminal Unicode support:
- Uses Unicode symbols on modern terminals (Windows Terminal, VSCode, iTerm, etc.)
- Falls back to ASCII on legacy terminals
Force a specific mode with environment variable:
# Force Unicode
PYTHON_CLACK_UNICODE=1 python app.py
# Force ASCII
PYTHON_CLACK_UNICODE=0 python app.py
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file python_clack-0.1.2.tar.gz.
File metadata
- Download URL: python_clack-0.1.2.tar.gz
- Upload date:
- Size: 41.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e175ac1ef4bcd9abf2b4931de3841d90e03e3bf0ce4d884bf1e775b55923980d
|
|
| MD5 |
e15b8e61a86c707613442702ab2fbd71
|
|
| BLAKE2b-256 |
acec949c89058ab972263b0930820c1681839a36acda027d436c2c0c4d93a1b4
|
Provenance
The following attestation bundles were made for python_clack-0.1.2.tar.gz:
Publisher:
publish.yml on oharu121/python-clack
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
python_clack-0.1.2.tar.gz -
Subject digest:
e175ac1ef4bcd9abf2b4931de3841d90e03e3bf0ce4d884bf1e775b55923980d - Sigstore transparency entry: 853350848
- Sigstore integration time:
-
Permalink:
oharu121/python-clack@81e73a723df8195733fb1a2f94c90b9364538474 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/oharu121
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@81e73a723df8195733fb1a2f94c90b9364538474 -
Trigger Event:
release
-
Statement type:
File details
Details for the file python_clack-0.1.2-py3-none-any.whl.
File metadata
- Download URL: python_clack-0.1.2-py3-none-any.whl
- Upload date:
- Size: 31.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9745a0f818480fae0a5230f4b61a481e0d53e00ca45b08710bc8698759221a78
|
|
| MD5 |
2e8cc3fedefa3be76325447bfad5cbde
|
|
| BLAKE2b-256 |
3eeca7f27e47f5922d95c8c4add125ec53570285374700a5ec9266b51f198852
|
Provenance
The following attestation bundles were made for python_clack-0.1.2-py3-none-any.whl:
Publisher:
publish.yml on oharu121/python-clack
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
python_clack-0.1.2-py3-none-any.whl -
Subject digest:
9745a0f818480fae0a5230f4b61a481e0d53e00ca45b08710bc8698759221a78 - Sigstore transparency entry: 853350864
- Sigstore integration time:
-
Permalink:
oharu121/python-clack@81e73a723df8195733fb1a2f94c90b9364538474 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/oharu121
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@81e73a723df8195733fb1a2f94c90b9364538474 -
Trigger Event:
release
-
Statement type: