A Textual Spinbox widget
Demo a Textual spinbox
Simply run from the repo with uv
uvx --from git+https://github.com/friscorose/textual-spinbox spinbox_demo
now you can scroll wheel up or down, drag up or down and click the up or down arrows to change the value in the spinbox. A simple ctrl+c to quit.
NB: This widget is also available from PyPI if you want to use pip/pipx to manage your python packages; ie.
uv venv
uv pip install textual-spinbox
Use uv to build an app
Build a silly app with a custom Textual spinbox widget using uv.
uv init sillyapp
then
cd sillyapp
edit hello.py to contain the following source
"""A silly demo of the SpinBox widget"""
from calendar import month_name
from textual.app import App, ComposeResult
from textual.reactive import reactive
from textual.widgets import Button, Label
from textual_spinbox import SpinBox
class Statement( Label ):
"""Make label reactive"""
silly = reactive( "...a silly statement.", recompose=True )
def compose(self) -> ComposeResult:
yield Label( self.silly )
class SpinboxApp(App):
"""The main demo app"""
DEFAULT_CSS = """
SpinBox {
width: 13;
}
"""
months = list(month_name)[1:]
things = ['albatross', 'boomerang', 'cat', 'dodo', 'ewe', 'flotilla', 'geriatric', 'hopscotch', 'ice flow', 'jalopy', 'Kobayashi Maru', 'lava', 'mycelium', 'narwhal', 'oil tanker', 'pod', 'quaaltagh', 'rat', 'snail', 'tiptoe', 'ukulele', 'verb', 'wheeriemigo', 'xanthippe', 'yill', 'zymurgy']
def compose(self) -> ComposeResult:
yield SpinBox( id="pennies" )
yield SpinBox( range(1,32), 21, id="date" )
yield SpinBox( self.months, id="month" )
yield SpinBox( self.things, "snail", id="thing" )
yield Button( "Make", variant="primary", id="make" )
yield Statement()
def on_button_pressed(self, event: Button.Pressed):
"""What to do when the button is clicked"""
if event.button.id == "make":
pennies = self.query_one("#pennies").value
date = self.query_one("#date").value
month = self.query_one("#month").value
thing = self.query_one("#thing").value
self.query_one("Statement").silly = f"""\
...my bank statement change by {pennies} cents on {month}/{date} \n\
Reason: compulsory {thing} race gambling."""
def exec_main():
"""Allow call by script handler in pyproject"""
app = SpinboxApp()
app.run()
if __name__ == "__main__":
exec_main()
make Textual available to the app
uv add textual
then make the textual-spinbox widget available
uv add "textual-spinbox @ git+https://github.com/friscorose/textual-spinbox"
now run it
uv run hello.py
Metadata
Release files for textual-spinbox 0.8.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| textual_spinbox-0.8.2.tar.gz | 3.7 kB | Without provenance | Details for textual_spinbox-0.8.2.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| textual_spinbox-0.8.2-py3-none-any.whl | Python 3 | none | any | Details for textual_spinbox-0.8.2-py3-none-any.whl |
Total release size: 9.3 kB
Release files / textual_spinbox-0.8.2.tar.gz
| Download URL | textual_spinbox-0.8.2.tar.gz |
|---|---|
| Size | 3.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4cc128cb856d01482eb3f57962d7ec1a3d5d139b841ab684f1ac4f408c69224a
|
|
BLAKE2b-256 checksum How to use checksums |
d5d2ac34a02e31b12586094f819eed64ff9911982ef8a63739004a5ff914ea70
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.5.29
|
Release files / textual_spinbox-0.8.2-py3-none-any.whl
| Download URL | textual_spinbox-0.8.2-py3-none-any.whl |
|---|---|
| Size | 5.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a690c96a5985dd19d5485e5974501de7bbda1c671cb2ab6aace152d1ac47ebbf
|
|
BLAKE2b-256 checksum How to use checksums |
929e57a44cca63ad0eb6f7674ae2b6b2d043f7e77c266b372483c5cf60aae40a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.5.29
|
Security for textual-spinbox 0.8.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.