Various time related widgets & functionality for Textual.
Project description
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
Code
from textual.app import App, ComposeResult
from textual_timepiece.pickers import DateTimePicker
from whenever import ZonedDateTime
class DateTimePickerApp(App[None]):
def compose(self) -> ComposeResult:
yield DateTimePicker(ZonedDateTime.from_system_tz(2025, 3, 4, 9, 42, 47)))
if __name__ == "__main__":
DateTimePickerApp().run()
Result
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
- More examples can be found here
License
MIT. Check LICENSE for more information.
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
textual_timepiece-0.7.0.tar.gz
(423.6 kB
view details)
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 textual_timepiece-0.7.0.tar.gz.
File metadata
- Download URL: textual_timepiece-0.7.0.tar.gz
- Upload date:
- Size: 423.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.10 {"installer":{"name":"uv","version":"0.10.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
be1a3388faa6936df96543597391b721fd340350f7a9cb2ad6904af7d4c77da8
|
|
| MD5 |
231588688b43269a711a03f412e0ee3e
|
|
| BLAKE2b-256 |
c957a437128c61c32e989afa73eb51bf144f6537b24dca6b0bfc69223a382199
|
File details
Details for the file textual_timepiece-0.7.0-py3-none-any.whl.
File metadata
- Download URL: textual_timepiece-0.7.0-py3-none-any.whl
- Upload date:
- Size: 59.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.10 {"installer":{"name":"uv","version":"0.10.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2efe16ad270f74407e6241d345e46423ec1319295447e8c0885925bf39851d77
|
|
| MD5 |
c7997e420ab0e86fc7570f7d71e38457
|
|
| BLAKE2b-256 |
48373cc0dc1156223d2cb5b0808d0ee68ad250479af0bf03908c93f6bf25011a
|