Как сделать меню в боте Телеграм python telebot

Мне нужна помощь,я пишу бота хочу сделать кнопку «назад в меню» как её сделать?

Ответы (3 шт):

Должно быть так, но я уже довольно давно не пишу тг ботов.

Для начала Вам нужно посмотреть обучающие видео (можно на YouTube)
Но. У Вас неправильное построение
Есть такая штука как callback_data , её мы пишем в KeyboardButton :

mrk = types.KeyboardButton(«Каталог», callback_data=’katalog’) mrk1 = types.KeyboardButton(«Корзина», callback_data=’cart’)

После этого создаём новый хендлер —

И новую функцию в нём

def answer(call):

Прошу заметить что тут уже не message , а call
И далее пишем что делать если была нажата кнопка —

if call.data == ‘katalog’: markup1 = types.ReplyKeyboardMarkup(resize_keyboard=True) mar = types.KeyboardButton(«Одежда», callback_data=odezda) mar2 = types.KeyboardButton(«Назад в меню», callback_data=back) markup1.add(mar,mar2) bot.send_message(message.chat.id,»Выберите,что вам нужно,если хотите вернуться в меню просто нажмите кнопку ‘Назад в меню’ «,reply_markup=markup1) elif call.data == ‘cart’: # Что то elif call.data == ‘back’: bot.send_message(message.chat.id, «Вы вернулись в меню»,reply_markup=None)

Если нужно больше примеров и показать как делать — пишите

Меню Команд в Боте: Примеры

Если Вы не хотите работать с callback_data то Вы можете просто убрать кнопки KeyboardButton с помощью редактирования сообщения —

bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text=»Вы уже выбрали», reply_markup=None) # Именно `reply_markup=None` делает это

Источник: husl.ru

Создание меню/кнопок в pyTelegramBotAPI на основе SQL запроса

В данной статье планирую поделиться с вами своей наработкой, которая позволяет создавать меню и кнопки вашего Telegram бота на основе данных хранящихся в БД.

Реализовывать все это будем на Python и нам потребуются библиотеки:

  • sqlite3 — для работы с БД (устанавливать не нужно, поставляется в коробке с Питоном)
  • pyTelegramBotAPI — для создания Telegram бота (предварительно необходимо установить)
Еще по теме:  Как найти что угодно в Телеграмме

Представьте, что мы имеем файл базы данных «database.db» с таблицей, которая называется «create_menu». Эта таблица хранит следующую информацию:

type_menu

order_num

btn_name

btn_callback

type_menu — название меню, к которому будет относиться данная кнопка

order_num — порядковый номер кнопки в меню (сверху вниз)

btn_name — текст, который будет отображаться на кнопке

btn_callback — данные, которые будут возвращены при нажатии на кнопку. Их будет отлавливать обработчик событий.

Ну что, теперь поехали!

Создадим класс CreateMenu и сразу инициализируем в нём путь к нашему файлу базы данных.

import os import sqlite3 from telebot import types class CreateMenu: def __init__(self): »’Конструктор класса. Определяет файл базы данных»’ self.__db_path = os.getcwd() self.db_name = os.path.join(self.__db_path, ‘database.db’)

По умолчанию считаем, что файл БД находиться в одном каталоге с файлом программы, поэтому строим путь к нему используя os.getcwd() и os.path.join().

Разработка Telegram Bot на Python. (7. Многоуровневое меню для магазина)

Теперь сделаем внутренний метод __connect() который будет отвечать за подключение к нашей БД с использованием библиотеки sqlite3.

def __connect(self): »’Функция подключения к базе данных»’ connect = sqlite3.connect(self.db_name) return connect

Так же сделаем внутренний метод __select_button() который будет бегать в БД с SQL запросом и возвращать нам словарь (dict), где ключ (key) = название кнопки и значение (value) = callback data этой кнопки. Что бы этот метод не тащил абы чего, он будет принимать аргумент type_menu. Это позволит нам набирать кнопки под конкретное меню.

def __select_button(self, type_menu: str) -> dict: »’В качестве аргумента принимает «тип меню». Возвращает словарь где ключ = текст кнопки, значение = callbackdata кнопки»’ with self.__connect() as connect: cursor = connect.cursor() sql = «»»SELECT btn_name, btn_callback FROM create_menu WHERE type_menu = (?) ORDER BY order_num»»» select_db = cursor.execute(sql, (type_menu,)) result = dict() for btn_name, btn_callback in select_db.fetchall(): result[btn_name] = btn_callback return result

Думаю стоит объяснить, что за магия тут твориться.-

  • Подключаемся к БД (используя ранее заготовленный __connect())
  • Выполняем SQL запрос, который дословно можно перевести : «Покажи мне «название кнопки» и «её callback» из таблицы create_menu где тип меню равен type_menu и отсортируй все это по order_num в порядке возрастания.
  • Создаем словарик в который будем записывать результат SQL запроса.
  • Пробегаемся в цикле по результату SQL запроса и добавляем новые записи в словарь.
  • Возвращаем из функции словарь. Например если мы передадим в качестве аргумента «main» функция вернёт словарь: )
Еще по теме:  Из шифрованной Телеграммы одесского градоначальника какое историческое событие произошло

Ну и давайте напишем единственный метод в классе, который будет вызываться программистом. Назовем его create_menu() и как вы догадались он будет создавать меню.

def create_menu(self, type_menu: str) -> types.InlineKeyboardMarkup: »’Создаём меню для TG бота»’ markup = types.InlineKeyboardMarkup() btn_list = self.__select_button(type_menu) for element in btn_list.items(): btn = types.InlineKeyboardButton(text= element[0], callback_data= element[1]) markup.add(btn) return markup

Метод в качестве аргумента принимает тип меню (type_menu), которое мы хотим создать. Далее он с этим аргументам дёргает выше рассмотренный внутренний метод __select_button() и получает в свое распоряжение словарик из которого будет лепить меню.

По классике жанра, пробегает словарик в цикле и добавляет в меню (markup) кнопки, где текст кнопки — ключ словаря, а её обратный данные — значение из словаря.

Итоговый код выглядит следующим образом:

import os import sqlite3 from telebot import types class CreateMenu: def __init__(self): »’Конструктор класса. Определяет файл базы данных»’ self.__db_path = os.getcwd() self.db_name = os.path.join(self.__db_path, ‘database.db’) def __connect(self): »’Функция подключения к базе данных»’ connect = sqlite3.connect(self.db_name) return connect def __select_button(self, type_menu: str) -> dict: »’В качестве аргумента принимает «тип меню». Возвращает словарь где ключ = текст кнопки, значение = callbackdata кнопки»’ with self.__connect() as connect: cursor = connect.cursor() sql = «»»SELECT btn_name, btn_callback FROM create_menu WHERE type_menu = (?) ORDER BY order_num»»» select_db = cursor.execute(sql, (type_menu,)) result = dict() for btn_name, btn_callback in select_db.fetchall(): result[btn_name] = btn_callback return result def create_menu(self, type_menu: str) -> types.InlineKeyboardMarkup: »’Создаём меню для TG бота»’ markup = types.InlineKeyboardMarkup() btn_list = self.__select_button(type_menu) for element in btn_list.items(): btn = types.InlineKeyboardButton(text= element[0], callback_data= element[1]) markup.add(btn) return markup

Теперь мы можем импортировать написанный нами класс в свой проект. Создать экземпляр класса CreateMenu и использовать его метод create_menu() для создания разного рода меню.

Примечание класс CreateMenu описывался мной в файле с именем db.py

Исходник проекта и файл базы данных из примера, вы найдёте у меня на GitHub

Еще по теме:  Как открыть кэш Телеграмма на компьютере

Надеюсь данный материал был полезен для вас!

Источник: habr.com

Как сделать многоуровневое меню телеграм бота ( inline — callback) на python?

Как сделать, что бы при нажатии на кнопку — открывалось новое меню из нескольких кнопок, с возможностью вернутся к главному меню?

Отслеживать
45.7k 16 16 золотых знаков 54 54 серебряных знака 95 95 бронзовых знаков
задан 13 фев 2018 в 12:00
9 1 1 золотой знак 1 1 серебряный знак 2 2 бронзовых знака
Тоже интересует такое меню!! если решение есть поделись кодом, буду признателен
10 сен 2018 в 18:20

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

#Например, при помощи reply_markup в edit_message_text def inline_key(num): «»»Функция для вывода кнопок «»» i=1 btns = [] while i
Отслеживать
ответ дан 5 мар 2018 в 20:25
11 1 1 бронзовый знак
Отслеживать
ответ дан 30 янв 2020 в 2:42
SmartCoder SmartCoder
11 1 1 бронзовый знак

  • python
  • python-3.x
  • telegram-bot
    Важное на Мете

Связанные

Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Источник: ru.stackoverflow.com

Рейтинг
( Пока оценок нет )
Загрузка ...