@clazy13

Почему при повторной нажатии Reply кнопки ничего не выводится?

У меня есть код
import telebot
from telebot import types

bot = telebot.TeleBot('')

@bot.message_handler(commands=['start'])
def start(message):
    markup = types.ReplyKeyboardMarkup()
    reviews = types.KeyboardButton('Отзывы от клиентов')
    location = types.KeyboardButton('Города')
    markup.row(reviews, location)
    goods = types.KeyboardButton('Товары')
    support = types.KeyboardButton('Поддержка')
    markup.row(goods, support)
    profile = types.KeyboardButton('Профиль')
    bonus = types.KeyboardButton('Бонус')
    markup.row(profile, bonus)
    bot.send_message(message.chat.id, f'''
    ,reply_markup=markup)
    bot.register_next_step_handler(message, on_click)

@bot.message_handler(commands=['city'])
def on_click(message):
    if message.text == 'Города':
        all_city = types.InlineKeyboardMarkup()
        tomsk = types.InlineKeyboardButton(text='Томск', callback_data='citytomsk')
        novosibirsk = types.InlineKeyboardButton(text='Новосибирск(В разработке)', callback_data='citynovosibirsk')
        krasnodar = types.InlineKeyboardButton(text='Краснодар(В разработке)', callback_data='citykrasnodar')
        moscow = types.InlineKeyboardButton(text='Москва(В разработке)', callback_data='citymoscow')
        all_city.add(tomsk)
        all_city.add(novosibirsk)
        all_city.add(krasnodar)
        all_city.add(moscow)
        bot.send_message(message.chat.id, 'Выберите ваш город для покупки товара:', reply_markup=all_city)


@bot.callback_query_handler(func=lambda call: True)
def сallbacktomsk(call):
    if call.data == 'citytomsk':
        tomsk_product = types.InlineKeyboardMarkup()
        cement = types.InlineKeyboardButton(text='Цемент 50кг М-500', callback_data='cementtomsk')
        plywood = types.InlineKeyboardButton(text='Фанера 8мм x 1,25 x 2,5м', callback_data='plywoodtomsk')
        tomsk_product.add(cement)
        tomsk_product.add(plywood)
        bot.send_message(call.message.chat.id,'Выберите товар:', reply_markup=tomsk_product)

@bot.callback_query_handler(func=lambda call: True)
def callbackcementtomsk(call):
    if call.message:
        if call.data == 'cementtomsk':
            with open('C:\CementBot.jpg' 'rb') as f1:
                bot.send_photo(call.message.chat.id, f1)


@bot.message_handler(commands=['help'])
def main(message):
    bot.send_message(message.chat.id, '<b>Здесь вы можете обращаться к службе поддержки бота</b>', parse_mode='html')

bot.polling(none_stop=True)


Почему при нажатии Reply кнопки(Города), а потом после нажатия Инлайн кнопки Томск я не могу повторно нажать на Reply кнопки(Города), ничего не выводится
  • Вопрос задан
  • 71 просмотр
Решения вопроса 1
RimMirK
@RimMirK
Вроде человек. Вроде учусь. Вроде пайтону
потому-что у тебя 2 равносильных обработчика.
@bot.callback_query_handler(func=lambda call: True)
def сallbacktomsk(call):
все на себя перехватывает, все остальные уже не сработают никак.
Порядок обработчиков всегда от более "конкретным" до менее.
С начала обработчики команд (/command)
Потом обработчики, например, картинок.
Потом обработчик всех сообщений, например, чтобы сказать что бот не понял пользователя (т.к. это сработает только если все выше не сработало.)
Потом уже инлайн обработчики, тоже уменьшая поле "зрения". Желательно вообще один.
@bot.callback_query_handler(func=lambda c: True)
def callback(c):
    if c.data.startswith('city'):
        match c.data.split('city',1)[-1]:
            case 'tomsk': ...


и не надо прописывать для каждого города по варианту. Используй БД.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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