Skip to main content

A simple spinbox widget for Textual

Project description

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.

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

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

textual_spinbox-0.8.1.tar.gz (10.1 kB view details)

Uploaded Source

Built Distribution

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

textual_spinbox-0.8.1-py3-none-any.whl (5.6 kB view details)

Uploaded Python 3

File details

Details for the file textual_spinbox-0.8.1.tar.gz.

File metadata

  • Download URL: textual_spinbox-0.8.1.tar.gz
  • Upload date:
  • Size: 10.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.5.3

File hashes

Hashes for textual_spinbox-0.8.1.tar.gz
Algorithm Hash digest
SHA256 066092699ee2cc86021d5fd7f43903a0eca7273a7ae4802234770279072557ab
MD5 965ac744da76bc4af6d46ee129078a44
BLAKE2b-256 4d05daf7fcda213118de039ad8da63ac3506485f6a1dea7fea0f1bc4b87c8550

See more details on using hashes here.

File details

Details for the file textual_spinbox-0.8.1-py3-none-any.whl.

File metadata

File hashes

Hashes for textual_spinbox-0.8.1-py3-none-any.whl
Algorithm Hash digest
SHA256 32c9e703a5e22318895ed466fb81c531399bb45615dc987ac6a0fe6ca16f080b
MD5 3de05fadaa148e9849e97e86e9e6bee6
BLAKE2b-256 54cb618e9cf0e07532de983583b2c8183c08e981b64b5ad566074e2e2ea39e99

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