Примеры виджетов для pybotx. Могут быть использованы в проектах ботов.
Выполните следующую команду в консоли:
poetry add git+https://github.com/ExpressApp/pybotx-widgets.git
carousel_img carousel_img carousel_img
carousel_img carousel_img carousel_img
from pybotx_widgets.carousel import CarouselWidget from botx import MessageMarkup ... @collector.handler(command="/some_command", name="some_command_name") async def some_command(message: Message, bot: Bot) -> None: markup = MessageMarkup() await CarouselWidget( widget_content, # All content to be displayed label, # Text of message start_from=0, # Start display content from displayed_content_count=3, # Count of content to be displayed selected_value_label="You selected: {selected_val}", # Display format of the selected value, default = "{label} {selected_val}" control_labels=("", ""), # Override default control labels inline=False, # Inline mode loop=False, # Loop content or not show_numbers=False, # Show content order numbers for prev/next control bubbles' labels. Default = False additional_markup=markup, # Additional markup for attaching to widget message=message, bot=bot, command="/some_command", # Widget will trigger this command when a value is selected. ).display() try: selected_value = await CarouselWidget.get_value(message, bot) except KeyError: ... # do something
Метод .display() отправляет пользователю сообщение с виджетом.
При отсутствии выбранного значения, метод .get_value() вызовет исключение.
Если виджет должен обновить уже отправленное сообщение, то добавьте в message.command.data ключ message_id
с UUID сообщения, которое нужно обновить
Когда loop=True, стрелки отображаются всегда
from pybotx_widgets.calendar import CalendarWidget ... @collector.handler(command="/some_command", name="some_command_name") async def some_command(message: Message, bot: Bot) -> None: await CalendarWidget( start_date: date = None, # Calendar start date, previews dates hides, default date.today() end_date: date = date.max, # Calendar end date, next dates hides, default date.max include_past=False, # Include past dates in calendar, default is False additional_markup=None, # Additional markup for attaching to widget, default None command_name="/some_command", # Widget will trigger this command when a value is selected. message=message, bot=bot, ).display() try: selected_value = await CalendarWidget.get_value() except KeyError: ... # do something
Метод .display() отправляет пользователю сообщение с виджетом.
При отсутствии выбранного значения, метод .get_value() вызовет исключение.
Когда пользователь выберет какое-то значение из виджета, метод .get_value() вернет его
Если виджет должен обновить уже отправленное сообщение, то добавьте в message.command.data ключ message_id
с UUID сообщения, которое нужно обновить
from pybotx_widgets.checklist import CheckListWidget ... @collector.handler(command="/some_command") async def some_command(message: Message, bot: Bot) -> None: await CheckListWidget( content, # All content to be displayed label, # Text of message command="/some_command", # Widget will trigger this command when a value is selected. message=message, bot=bot, ).display() try: current_selected_item = CheckListWidget.get_value(message) except KeyError: ... # do something all_selected_items = CheckListWidget.get_checked_items(message) if all_selected_items: ... # do something
Метод .display() отправляет пользователю сообщение с виджетом.
При отсутствии выбранного значения, метод .get_value() вызовет исключение.
Список всех выбранных элементов можно получить через метод .get_checked_items(message), по умолчанию пустой список.
Если виджет должен обновить уже отправленное сообщение, то добавьте в message.command.data ключ message_id
с UUID сообщения, которое нужно обновить
from pybotx_widgets.pagination import PaginationWidget ... @collector.handler(command="/some_command") async def some_command(message: Message, bot: Bot) -> None: await PaginationWidget( content, # All content to be displayed: List[SendingMessage] paginate_by, # Number of messages on one page command="/some_command", # Widget will trigger this command when a value is selected. message=message, bot=bot, ).display()
Метод .display() отправляет пользователю сообщение с виджетом.\
Если виджет должен обновить уже отправленное сообщение, то добавьте в message.command.data ключ message_id
с UUID сообщения, которое нужно обновить
from pybotx_widgets.checktable import ChecktableWidget ... @collector.handler(command="/some_command") async def some_command(message: Message, bot: Bot) -> None: await ChecktableWidget( content, # All content to be displayed: List[CheckboxContent] label, # Text of message "uncheck_command", # Command for handler which uncheck value "some_command", # Command for bubbles command attribute additional_markup, # Additional markup for attaching to widget message=message, bot=bot, ).display()
Для корректной работы виджета нужно создать хэндлер с командой uncheck_command и прописать в нем поведение при сбрасывании значения.
from pybotx_widgets.checktable import ChecktableWidget from pybotx_widgets.undefined import undefined ... UNCHECK_COMMAND = "/_checkbox:uncheck" @collector.hidden(command=UNCHECK_COMMAND) async def checkbox_uncheck(message: Message, bot: Bot) -> None: field_name = message.data.get("field_name") my_object = await get_my_object() setattr(my_object, field_name, undefined) await set_my_object(my_object) checkboxes = await build_checkboxes(my_object) await ChecktableWidget(message, bot, my_object, "some_label", UNCHECK_COMMAND).display()
В pybotx_widgets.resources.strings есть следующие эмодзи:
LEFT_ARROW = ⬅️
RIGHT_ARROW = ➡️
UP_ARROW = ⬆️
DOWN_ARROW = ⬇️
CHECKBOX_CHECKED = ☑
CHECKBOX_UNCHECKED = ☐
CHECK_MARK = ✔️
ENVELOPE = ✉️
PENCIL = ✏️
CROSS_MARK = ❌