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.4.1.tar.gz (7.3 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.4.1-py3-none-any.whl (9.0 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for tgwidget-0.4.1.tar.gz
Algorithm Hash digest
SHA256 903a1a179903ab5d1d3679b4d2d31f0676d3a70d9cb83c79a0ff1145b69bb8ff
MD5 b3d30ab511156dbbc141c6122f579186
BLAKE2b-256 fbed25d9999fe268c97b5d9dacd592f17b2efb852a8e07724b56c35a8de3d47f

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for tgwidget-0.4.1-py3-none-any.whl
Algorithm Hash digest
SHA256 4753a5f7dd3c24eb6178341fc24f891f31b0deae4434943d78d26c90dbd1377c
MD5 08014c9b02f0210d701c41ca34fa955d
BLAKE2b-256 1f36ecfbb705468be9c2f6bcef154f2e5d5fd883fbdbe61807c2b66fc0ce97db

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