Telebot内联菜单点击后发新消息而非修改原菜单问题求助
解决方案
你现在的问题是用了发送新消息的send_message方法,要编辑原有菜单消息,替换成pyTelegramBotAPI提供的edit_message_text方法即可,这个方法可以修改已经发送的消息内容和绑定的内联键盘。
具体修改点
- 回调函数
submenus中,把原来调用bot.send_message的代码替换成调用bot.edit_message_text - 传入原有消息的ID参数:你从回调对象
c里可以拿到c.message.message_id,就是原来触发回调的菜单消息的ID - 新增回调应答逻辑,避免Telegram端按钮一直显示加载转圈状态
修改后的完整代码
import telebot # 这里替换成你自己的bot token bot = telebot.TeleBot('你的BOT_TOKEN') @bot.message_handler(commands=['menu']) def menu(message): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.add(telebot.types.InlineKeyboardButton('Reglas', callback_data='Reglas')) keyboard.add(telebot.types.InlineKeyboardButton('Consultas', callback_data='Consultas')) keyboard.add(telebot.types.InlineKeyboardButton('Historia', callback_data='Historia')) keyboard.add(telebot.types.InlineKeyboardButton('Tiradas', callback_data='Tiradas')) keyboard.add(telebot.types.InlineKeyboardButton('Admin', callback_data='adm')) bot.send_message(message.chat.id,'Has llamado al menu?',reply_markup=keyboard) @bot.callback_query_handler(func=lambda c:True) def submenus(c): # 应答回调,避免按钮加载超时 bot.answer_callback_query(c.id) if c.data == 'Tiradas': keyboard = telebot.types.InlineKeyboardMarkup() keyboard.add(telebot.types.InlineKeyboardButton('Tirada suelta', callback_data='ts')) keyboard.add(telebot.types.InlineKeyboardButton('Tirada de personajes',callback_data='tp')) # 调用编辑消息方法,修改原有菜单 bot.edit_message_text( chat_id=c.message.chat.id, message_id=c.message.message_id, text='Deseas tiradas sueltas o para crear personajes?', reply_markup=keyboard ) # 启动机器人轮询 bot.infinity_polling()
补充说明
- 如果后续要做返回上一级菜单的功能,只需要在对应回调逻辑里再调用一次
edit_message_text,把内容和键盘换回上一级菜单即可 - 如果编辑消息时不需要修改文本、只需要更换内联键盘,可以用
edit_message_reply_markup方法,参数和上述方法一致,不需要传text参数
内容的提问来源于stack exchange,提问作者SatanicPower616
相关产品推荐
相关产品推荐

