Во-первых, надо определиться каким образом вы выводите кнопку - от этого отличаются методы обработки событий.
Есть два вида кнопок - это кастомной клавиатура, которая заменяет собой стандартную клавиатуру, либо онлайн кнопки - выводятся под сообщением. Для того и другого варианта не забудь импортировать библиотеку:
from telebot import types
1. Генерация кастомной клавиатуры.
Я делал отдельную функцию для генерации клавиатуры, которая получает в качестве аргументов. Создание клавиатуры выглядет следующим образом:
keyboard = utilits.generate_keyboard('Сделать заказ', 'Хочу скидку на заказ', 'Изменить персональную информацию')
bot.send_message(message.chat.id, msg, reply_markup=keyboard)
Тут создаем keyboard с помощью функции generate_keyboard, которая у меня лежит в файле utilits. Передаем в качестве аргументов то, что должно быть написано на кнопках.
Сама функция generate_keyboard:
def generate_keyboard (*answer):
keyboard = types.ReplyKeyboardMarkup(one_time_keyboard=True, resize_keyboard=True)
for item in answer:
button = types.KeyboardButton(item)
keyboard.add(button)
return keyboard
Здесь вызываем метод ReplyKeyboardMarkup из библиотеки types. Дальше проходимся итеративно по полученным аргументам и генерируем кнопки попутно добавляя кнопки к клавиатуре - keyboard.add(button).
Возвращаем собранную клавиатуру.
Далее обрабатываем полученный ответ. Я для обработки полученного ответа придумал следующий костыль - статус каждого клиента, который храню вместе с его ID в базе данных. Статус - по сути место каждого клиента на пути к оформлению заказа:
@bot.message_handler(content_types=["text"])
def check_text_message(message):
status = int()
try:
status = config.current_users[message.chat.id][0]
except Exception as er:
status = 0
if status == 0:
bot.send_message(message.chat.id, 'Извините, я запутался. Давайте начнем сначала')
first_step(message)
elif status == 10:
if message.text == 'Сделать заказ':
Dialogs.order(message) ...
То есть проверяю статус - "elif status == 10:"
Если мы тут и получаем ответ "Сделать заказ", то выводим следующее сообщение, которое генерируем с помощью функции order - "Dialogs.order(message)". Эта же функция у меня и меняет статус, сохраняя его по пути в БД, на случай если бот "ляжет" и забудет кто на каком этапе находиться.
2. Генерация онлайн клавиатуры.
Все очень походе. Вот так генерирую такой тип клавиатуры, но тут необходимо помимо надписи на самой кнопке задать еще и команду, по которой мы и будем событие обрабатывать дополнительно (callback_data):
keyboard = utilits.generate_inline_keyboard(['Имя', 'change_name'],
['Телефон', 'change_phone'],
['️Адрес', 'change_adress'],
['Вернуться обратно', 'back'])
def generate_inline_keyboard (*answer):
keyboard = types.InlineKeyboardMarkup()
temp_buttons = []
for i in answer:
temp_buttons.append(types.InlineKeyboardButton(text=i[0], callback_data=i[1]))
keyboard.add(*temp_buttons)
return keyboard
А это обработка событий. Тут проще, можно обрабатывать не через статус, а по конкретной callback_data:
@bot.callback_query_handler(func=lambda call: True)
def ans(call):
try:
message = call.message
if call.data == 'change_name':
Dialogs.change_name(message)
elif call.data == 'change_phone': ...