Мне нужна помощь,я пишу бота хочу сделать кнопку «назад в меню» как её сделать?
Ответы (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