我与 python-telegram-bot
一起工作,并尝试像 BotFather 机器人那样构建一个嵌套菜单系统。例如,您有一个通用的机器人菜单
您可以在其中选择“编辑机器人”并获得相应的新菜单
带有返回上一个菜单的选项。
我尝试用代码来实现:
# main menu
def start(bot, update):
menu_main = [[InlineKeyboardButton('Option 1', callback_data='m1')],
[InlineKeyboardButton('Option 2', callback_data='m2')],
[InlineKeyboardButton('Option 3', callback_data='m3')]]
reply_markup = InlineKeyboardMarkup(menu_main)
update.message.reply_text('Choose the option:', reply_markup=reply_markup)
# all other menus
def menu_actions(bot, update):
query = update.callback_query
if query.data == 'm1':
# first submenu
menu_1 = [[InlineKeyboardButton('Submenu 1-1', callback_data='m1_1')],
[InlineKeyboardButton('Submenu 1-2', callback_data='m1_2')]]
reply_markup = InlineKeyboardMarkup(menu_1)
bot.edit_message_text(chat_id=query.message.chat_id,
message_id=query.message.message_id,
text='Choose the option:',
reply_markup=reply_markup)
elif query.data == 'm2':
# second submenu
# first submenu
menu_2 = [[InlineKeyboardButton('Submenu 2-1', callback_data='m2_1')],
[InlineKeyboardButton('Submenu 2-2', callback_data='m2_2')]]
reply_markup = InlineKeyboardMarkup(menu_2)
bot.edit_message_text(chat_id=query.message.chat_id,
message_id=query.message.message_id,
text='Choose the option:',
reply_markup=reply_markup)
elif query.data == 'm1_1':
...
elif query.data == 'm1_2':
...
# and so on for every callback_data option
...
# handlers
dispatcher.add_handler(CommandHandler('start', start))
dispatcher.add_handler(CallbackQueryHandler(menu_actions))
这段代码有效,但我觉得它有点不合理——构建一个长的 elif
树。
此外,我无法弄清楚如何为用户提供从二级菜单返回主菜单的选项(因为主菜单位于另一个处理程序中,我无法通过回调捕获它 CallbackQueryHandler
)。
所以问题是——构建这种菜单系统的最佳实践是什么?
原文由 DemX86 发布,翻译遵循 CC BY-SA 4.0 许可协议
@dzNET 的回答很好。但它不会在 V12 中工作所以我改变了一点
再次感谢@dzNET