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.
Timeline Description
HorizontalEntry Horizontal entry for a horizontal timeline layout.
HorizontalRuler Horizontal ruler for marking horizontal timelines.
HorizontalTimeline Basic timeline widget that displays entries in a horizontal view.
HorizontalTimelineNavigation Horizontal widget containing a horizontal timeline and header.
RuledHorizontalTimeline Ruled horizontal timeline with markers.
RuledVerticalTimeline Ruled vertical timeline with markers.
VerticalEntry Vertical entry for a vertical timeline layout.
VerticalRuler Vertical ruler for marking vertical timelines.
VerticalTimeline Basic timeline widget that displays entries in a vertical view.
VerticalTimelineNavigation Vertical widget containing a vertical timeline and header.
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 textual-timepiece

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.5.1.tar.gz (306.4 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.5.1-py3-none-any.whl (58.8 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for textual_timepiece-0.5.1.tar.gz
Algorithm Hash digest
SHA256 40ce7c971cf2dae2c14acb376236f116e65cd4776e2d1d7bfe06e019696f1239
MD5 146408ed15c1b8968a1c297fb016ac2c
BLAKE2b-256 8f39780ea90610875dff6de4b7d5e7f0bc9e695df9d1db080cc90177fcd3eae7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for textual_timepiece-0.5.1-py3-none-any.whl
Algorithm Hash digest
SHA256 effb05df0951faa3994b2426e5bfc4abec94aa252714eab07dec38a7a4230042
MD5 0d1c9ae2cf42edae39109b064a67472a
BLAKE2b-256 8c310195d9ee44fd1b23790b45df9cc96e09346cf1ae224aa7e00a099baf6aed

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