Skip to main content

Python SDK for TeleWidget — Telegram Mini App widgets

Project description

tgwidget

Python SDK for TeleWidget — beautiful Telegram Mini App widgets for bots.

Install

pip install tgwidget

Usage

Generate widget URL

from tgwidget import TgWidget

# Date picker
url = TgWidget("your_bot").date(mode="datetime", format="unix-s").url()

# Color picker
url = TgWidget("your_bot").color(format="hex").url()

# Schedule (range — time windows per day)
url = TgWidget("your_bot").schedule().url()

# Schedule (single — fixed time per day)
url = TgWidget("your_bot").schedule(format="single").url()

# With styling
url = (
    TgWidget("your_bot")
    .date(mode="date")
    .style(color_scheme="dark", accent="#FF6600", adopt_tg_palette=True)
    .url()
)

Parse results

When a user completes the widget, the result comes back via deep link t.me/your_bot?start=VALUE. Parse the value:

from tgwidget import parse_date, parse_color, parse_schedule

# Date result — returns native datetime.date object
result = parse_date("2025-03-15", mode="date")
# result.date == '2025-03-15'
# result.date_obj == datetime.date(2025, 3, 15)

# Datetime — returns native datetime object
result = parse_date("2025-03-15_14-30", mode="datetime")
# result.datetime_obj == datetime.datetime(2025, 3, 15, 14, 30)
# result.date_obj == datetime.date(2025, 3, 15)
# result.time_obj == datetime.time(14, 30)

# Time — returns native datetime.time
result = parse_date("14-30", mode="time")
# result.time_obj == datetime.time(14, 30)

# Date range with unix timestamps
result = parse_date("1710460800_1718236800", mode="date-range", format="unix-s")
# result.datetime_obj, result.datetime_end_obj — native datetime objects

# Color result
result = parse_color("FF6600", format="hex")
# ColorResult(raw='FF6600', hex='#FF6600')

# Schedule result — range (56-char range format)
result = parse_schedule("09001800090018000000000009001800090018000000000000000000")
# [ScheduleDay(enabled=True, start='09:00', end='18:00',
#              start_time=datetime.time(9, 0), end_time=datetime.time(18, 0)), ...]

# Schedule result — single (28-char single format)
result = parse_schedule("1200120099991200120099999999", format="single")
# [ScheduleDay(enabled=True, time_str='12:00', time_obj=datetime.time(12, 0)), ...]

All parsers automatically handle Telegram bot command prefixes — you can pass raw /start payload strings directly:

result = parse_date("/start 2025-03-15", mode="date")
# result.date_obj == datetime.date(2025, 3, 15)

result = parse_color("/start FF6600", format="hex")
# result.hex == '#FF6600'

Date options

The .date() method accepts extra keyword arguments for controlling initial state and validation:

# Duration picker: no auto-select, starts at 00:00:00
url = TgWidget("your_bot").date(mode="time-seconds", auto_now=False).url()

# Duration with custom default
url = TgWidget("your_bot").date(mode="time-seconds", auto_now=False, default="01-30-00").url()

# Time picker with allowed range
url = TgWidget("your_bot").date(mode="time", min="09-00", max="18-00").url()

# Range validation in parser
widget = TgWidget("your_bot").date(mode="time-seconds", min="00-00-00", max="23-59-59")
widget.parse("25-00-00")  # raises ValueError
Option Type Description
auto_now bool Auto-select current time on open. Default: True for time/datetime, not set otherwise.
default str Default value in widget format (e.g. "01-30-00"). Used when auto_now is False.
min str Minimum allowed value. Validated both in frontend and by SDK parser.
max str Maximum allowed value. Validated both in frontend and by SDK parser.

Pattern (informational format string)

Each widget exposes a .pattern property — a human-readable format hint you can show to users:

widget = TgWidget("your_bot").date(mode="datetime")
widget.pattern  # "YYYY-MM-DD HH:MM"

widget2 = TgWidget("your_bot").date(mode="date", order="dmy")
widget2.pattern  # "DD-MM-YYYY"

widget3 = TgWidget("your_bot").color(format="hex")
widget3.pattern  # "#RRGGBB"

# Use in bot messages:
await ctx.reply(f"Введите дату в формате {widget.pattern}")

You can also use the standalone get_pattern(widget, mode, format, order) function directly.

Widget-level parsing with parse()

If you keep a reference to the widget builder, you can call .parse() directly — it automatically uses the configured widget type and options:

widget = TgWidget("your_bot").date(mode="datetime")
url = widget.url()

# Later, when the user completes the widget:
result = widget.parse("/start 2025-03-15_14-30")
# result.datetime_obj == datetime.datetime(2025, 3, 15, 14, 30)

API

TgWidget(bot_username)

Create a widget builder.

  • .date(mode, format, order, *, auto_now, default, min, max) — Date/time picker
  • .color(format) — Color picker
  • .schedule(format) — Weekly schedule (format: 'range' | 'single')
  • .style(color_scheme, accent, tint, liquid_glass, adapt_tg_theme, adopt_tg_palette) — Styling
  • .url(base_url) — Generate the final URL
  • .payload() — Get the raw payload dict
  • .pattern — Human-readable format string (e.g. "YYYY-MM-DD HH:MM")
  • .parse(value) — Parse a widget result string (auto-detects parser from widget type)

Parsers

  • parse_date(value, mode, format, order, *, min, max)DateResult (raises ValueError if outside min/max)
  • parse_color(value, format)ColorResult
  • parse_schedule(value, format)list[ScheduleDay]

Result types

DateResult

  • date, time, date_end, time_end — string representations
  • timestamp, timestamp_end — raw integer timestamps (unix modes)
  • datetime_obj, datetime_end_obj — native datetime.datetime
  • date_obj, date_end_obj — native datetime.date
  • time_obj, time_end_obj — native datetime.time

ColorResult

  • raw — original value string
  • hex — e.g. '#FF6600'
  • rgb — e.g. (255, 102, 0)
  • hsl — e.g. (24, 100, 50)

ScheduleDay

  • enabled — whether the day is active
  • start, end — time strings e.g. '09:00' (range format)
  • start_time, end_time — native datetime.time (range format)
  • time_str — single time string e.g. '12:00' (single format)
  • time_obj — native datetime.time (single format)

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

tgwidget-0.5.0.tar.gz (7.8 kB view details)

Uploaded Source

Built Distribution

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

tgwidget-0.5.0-py3-none-any.whl (9.6 kB view details)

Uploaded Python 3

File details

Details for the file tgwidget-0.5.0.tar.gz.

File metadata

  • Download URL: tgwidget-0.5.0.tar.gz
  • Upload date:
  • Size: 7.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for tgwidget-0.5.0.tar.gz
Algorithm Hash digest
SHA256 d3dc6884e8709ba8fa71ead30639f63b5f87b2abc6dfad94a250521b0ee7e199
MD5 5b0bd9671190dfa4962e6ce1fed3d6c6
BLAKE2b-256 d286107a5f83de8f09f5144312e74b51af7de740bf262e27e2b25d472c32b520

See more details on using hashes here.

File details

Details for the file tgwidget-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: tgwidget-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 9.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for tgwidget-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 54921fbd04b53b7f903ef37716ed0b03d5be3e1935f704a0b1c2db87e81f209b
MD5 d47237c0906331526e7e00a86eef129a
BLAKE2b-256 53cc271f7d048bd3aa840e93b20f43f5af27e8d20d45cd8ce565eb5d4a793cfe

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