@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)
  • Вопрос задан
  • 195 просмотров
Решения вопроса 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.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
26 июн. 2024, в 02:23
5000 руб./за проект
26 июн. 2024, в 00:28
5000 руб./за проект
25 июн. 2024, в 23:31
1500 руб./за проект