Skip to main content

Various time related widgets & functionality for Textual.

Project description

PyPI - Version PyPI - Python Version GitHub Actions Workflow Status codecov

Textual Timepiece

Various time management related widgets for the Textual framework.

Documentation | Changelog | PyPi

Included Widgets
Pickers Description
DatePicker A visual date picker with an input and overlay.
DurationPicker Visual duration picker with duration up to 99 hours.
TimePicker Visual time picker for setting a time in a 24 hour clock.
DateTimePicker Datetime picker that combines a date and time.
DateRangePicker Date range picker for picking an interval between two dates.
DateTimeRangePicker Range picker for picking an interval between two times.
DateTimeDurationPicker Pick an interval between two times, including a duration input.
Activity Heatmap Description
ActivityHeatmap Activity Heatmap for displaying yearly data similar to the GitHub contribution graph.
HeatmapManager Widget for browsing the Activity Heatmap with yearly navigation builtin.
Selector Description
DateSelect Date selection widget with calendar panes.
TimeSelect Time selection widget with various times in 30 minute intervals.
DurationSelect Duration selection widget with modifiers for adjust time or duration.
Input Description
DateInput Date input which takes in a iso-format date.
TimeInput Time input that takes in 24 hour clocked in a HH:MM:SS format.
DurationInput Duration input with a duration up to 99 hours.
DateTimeInput An input with a combination of a date and time in iso-format.

Demo

UVX

uvx --from textual-timepiece demo

PIPX

pipx run textual-timepiece

Install

Pip

pip install textual-timepiece

UV

uv add textual-timepiece

Poetry

poetry add textual-timepiece

[!NOTE] Requires whenever as an additional dependency.

Quick Start

DatePicker

Code
from textual.app import App, ComposeResult
from textual_timepiece.pickers import DatePicker
from whenever import Date

class DatePickerApp(App[None]):
    def compose(self) -> ComposeResult:
        yield DatePicker(Date(2025, 3, 4))

if __name__ == "__main__":
    DatePickerApp().run()
Result

DateTimePicker Example

DateTimePicker

Code
from textual.app import App, ComposeResult
from textual_timepiece.pickers import DateTimePicker
from whenever import SystemDateTime

class DateTimePickerApp(App[None]):
    def compose(self) -> ComposeResult:
        yield DateTimePicker(SystemDateTime(2025, 3, 4, 9, 42, 47)))

if __name__ == "__main__":
    DateTimePickerApp().run()
Result

DatePicker Example

ActivityHeatmap

Code
import random
from collections import defaultdict

from textual.app import App, ComposeResult
from textual_timepiece.activity_heatmap import ActivityHeatmap, HeatmapManager


class ActivityApp(App[None]):
    def _on_heatmap_manager_year_changed(
        self,
        message: HeatmapManager.YearChanged,
    ) -> None:
        message.stop()
        self.set_heatmap_data(message.year)

    def retrieve_data(self, year: int) -> ActivityHeatmap.ActivityData:
        """Placeholder example on how the data could be generated."""
        random.seed(year)
        template = ActivityHeatmap.generate_empty_activity(year)
        return defaultdict(
            lambda: 0,
            {
                day: random.randint(6000, 20000)
                for week in template
                for day in week
                if day
            },
        )

    def set_heatmap_data(self, year: int) -> None:
        """Sets the data based on the current data."""
        self.query_one(ActivityHeatmap).values = self.retrieve_data(year)

    def _on_mount(self) -> None:
        self.set_heatmap_data(2025)

    def compose(self) -> ComposeResult:
        yield HeatmapManager(2025)


if __name__ == "__main__":
    ActivityApp().run()
Result

ActivityHeatmap Example

  • More examples can be found here

License

MIT. Check LICENSE for more information.

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_timepiece-0.4.0.tar.gz (264.5 kB view details)

Uploaded Source

Built Distribution

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

textual_timepiece-0.4.0-py3-none-any.whl (42.8 kB view details)

Uploaded Python 3

File details

Details for the file textual_timepiece-0.4.0.tar.gz.

File metadata

  • Download URL: textual_timepiece-0.4.0.tar.gz
  • Upload date:
  • Size: 264.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.6.5

File hashes

Hashes for textual_timepiece-0.4.0.tar.gz
Algorithm Hash digest
SHA256 2001375a653479af1619c06df19abaf71e9e20c5c965b44b29fb6e3d89976d7a
MD5 a6134589573a794bf986cb1fabcf9da5
BLAKE2b-256 969e60f2edd4ebb995ab354c5265d96b16696dc06fe4e6d864fdeb0afdd51e80

See more details on using hashes here.

File details

Details for the file textual_timepiece-0.4.0-py3-none-any.whl.

File metadata

File hashes

Hashes for textual_timepiece-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ee55ab0514acdc75206ed34f4f754f7a2c6f3ae9a219a31a83cec540fa62be8e
MD5 ef580d620f4bfcfee1fd3e26bb985069
BLAKE2b-256 543247308be4b8202b26004ef2557b1e2ed5421c1616f02c9d602185378b3763

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