首页 > 解决方案 > 如何使用 CallbackQueryHandler 按钮函数更改对话处理程序状态

问题描述

我有一个 python 电报机器人,它可以像这样发送带有按钮的消息:

keyboard = [[telegram.InlineKeyboardButton("Finish", callback_data='1'),
             telegram.InlineKeyboardButton("Edit", callback_data='2')]]
update_obj.message.reply_text(message_text, reply_markup=reply_markup,
                              parse_mode=telegram.ParseMode.MARKDOWN)

带有两个按钮的电报消息的图像

现在,当用户点击“编辑”按钮时,我希望 ConversationHandler 移动到另一个状态。这是我的 ConversationHandler 的一部分:

WELCOME = 0
SEARCH = 2
EDITTITLE = 3
[...]
handler = telegram.ext.ConversationHandler(
    entry_points=[telegram.ext.CommandHandler('start', start)],
    states={
        WELCOME: [
            telegram.ext.MessageHandler(filters=telegram.ext.Filters.all, callback=welcome),
            updater.dispatcher.add_handler(telegram.ext.CallbackQueryHandler(button))
        ],
        SEARCH: [
            telegram.ext.MessageHandler(filters=telegram.ext.Filters.all, callback=search),
            updater.dispatcher.add_handler(telegram.ext.CallbackQueryHandler(button))
        ], EDITTITLE: [
            telegram.ext.MessageHandler(filters=telegram.ext.Filters.all, callback=editTitle)
        ]
[...]

现在通常我可以从 MessageHandler 的回调函数中返回新状态,如下所示:

def search(update_obj, context):
    [...]
    return WELCOME

但是,如果我在按钮功能中返回新状态,它不会切换到该状态。这是代码:

def button(update_obj, context):
    [...]
    return EDITTITLE

如何使按钮更改 ConversationHandler 状态,或者我缺少什么?我是否以正确的方式使用按钮?

谢谢 :)

标签: python-telegram-bot

解决方案


您在CallbackQueryHandlers对话中添加了错误的内容。updater.dispatcher.add_handler(telegram.ext.CallbackQueryHandler(button))返回None,因此None将添加到状态WELCOME和的处理程序列表中SEARCH。相反,它应该只是telegram.ext.CallbackQueryHandler(button). 可能还有其他问题,但我必须看到一个完整的最小工作示例来判断。


免责声明:我目前是python-telegram-bot.


推荐阅读