@logixpro

Не могу исправить проблему, бот не может отправить сообщение по нажатии кнопки?

искал варианты в интернете, не смог найти, документацию я также пробовал читать, но я не силен в ее разборе, сам я не знаток в программировании, просто пришлось столкнуться с разработкой. Пробовал множество вариантов кодов, вот последний который я пытался испробовать, но ничего не вышло. Проблема сама примерно вот такая: Я хочу, чтобы были инлайн клавиши и после их нажатия, бот отправлял сообщение, чтобы они также были с инлайн кнопками, но он не хочет этого выполнять, из всех моих попыток вышло только, чтобы он просто ответил на сообщение по нажатию кнопки, но теперь даже это не выходит.
В кнопке написано "Текст", не обращайте внимание, я просто не придумал еще текст к этой кнопке, я решил сначала найти ответ.
@bot.callback_query_handler(func=lambda call: True)
def callback(call):
    if call.data == 'Sity':
        Keyboard = types.InlineKeyboardMarkup()
        Istanbul = types.InlineKeyboardButton('Текст', callback_data='turkish')
        bot.send_message(call.message.chat.id,'Вы выбрали город: Стамбул', reply_markup=Keyboard)
  • Вопрос задан
  • 372 просмотра
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Ну твоя проблема уже тут:
@bot.callback_query_handler(func=lambda call: True)

Ты говоришь боту "вызывай эту функцию всякий раз, когда пользователь нажимает кнопку"(callback_query_handler), и добавляешь "неважно, какая кнопка была нажата" (func=lambda call: True).
Поэтому у тебя callback() будет вызываться при нажатии ЛЮБОЙ кнопки.

Если ты хочешь, чтобы при нажатии разных кнопок вызывались разные функции, тебе нужно разделить их с помощью параметра func. В нём ты передаёшь маленькую функцию-фильтр, которая отвечает на вопрос "может ли эта функция обработать это нажатие?". Бот перебирает зарегистрированные callback-обработчики, и вызывает первый, чей фильтр вернул True.

Т.е. тебе нужно написать такие фильтры, которые смогут разделить нажатия отдельных кнопок.
Простой способ это сделать - реализовать иерархию в callback_data, например так:
# обрабатываем то, что начинается с 'city.'
@bot.callback_query_handler(func=lambda call: call.data.startswith('city.'))
def callback(call):
    city = call.data[len('city.'):]  # отрезаем префикс 'city.'
    if city == 'istanbul':
        bot.send_message(call.message.chat.id,'Вы выбрали город: Стамбул')
    elif city == 'moscow':
        bot.send_message(call.message.chat.id,'Вы выбрали город: Москва')
    else:
        bot.send_message(call.message.chat.id,'Я не знаю такого города')

А до этого ты где-то в другом обработчике послал сообщение с клавиватурой вида
keyboard = types.InlineKeyboardMarkup()
# обрати внимание, callback_data всегда начинается с 'city.'
keyboard.add(types.InlineKeyboardButton('Стамбул', callback_data='city.istanbul'))  
keyboard.add(types.InlineKeyboardButton('Москва', callback_data='city.moscow'))

Так ты можешь разделить обработчики для разных наборов кнопок.

Еще советую почитать про FSM.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы