首页 > 解决方案 > 如何使 Telegram 中的 InlineKeyboardButton 触发命令?

问题描述

我想InlineKeyboardButton在我的 python 电报机器人中使用一个来触发next命令。我试图从这个答案中汲取灵感,但我一定遗漏了一些东西。事实上,当我点击对话中的“下一步”按钮时,我收到以下错误消息:AttributeError: 'NoneType' object has no attribute 'reply_text'. 意料之中的“往前走,那就好!” 消息未显示在对话中。

如何通过单击按钮修复我的代码以正确启动命令,同时又不会失去/next在聊天中调用命令的能力?

def start(update, context):
    context.user_data["step"] = 0  # Initialize step counter
    update.message.reply_text(
        f"Hello, you're starting at step {context.user_data['step']}.",
        reply_markup=menu_keyboard(),
    )


def next(update, context):
    context.user_data["step"] += 1
    update.message.reply_text("Going forward!")
    update.message.reply_text(
        f"We're now at step {context.user_data['step']}.", reply_markup=menu_keyboard()
    )


def menu_keyboard():
    keyboard = [[InlineKeyboardButton("➡️ Next", callback_data="next")]]
    return InlineKeyboardMarkup(keyboard)


def button(update, context):
    query = update.callback_query
    query.answer()
    if query.data == "next":
        next(update, context)


def main():
    updater = Updater("TOKEN", use_context=True)

    dp = updater.dispatcher
    dp.add_handler(CommandHandler("start", start))
    dp.add_handler(CommandHandler("next", next))
    dp.add_handler(CallbackQueryHandler(button))

    updater.start_polling()
    updater.idle()

标签: pythontelegram-botpython-telegram-bot

解决方案


我发现你的错误不是 update.callback_query 你必须使用 update.effective_message

这是您的更新代码!!!

def start(update, context):
    context.user_data["step"] = 0  # Initialize step counter
    update.message.reply_text(
        f"Hello, you're starting at step {context.user_data['step']}.",
        reply_markup=menu_keyboard(),
    )


def next(update, context):
    context.user_data["step"] += 1
    update.message.reply_text("Going forward!")
    update.message.reply_text(
        f"We're now at step {context.user_data['step']}.", reply_markup=menu_keyboard()
    )


def menu_keyboard():
    keyboard = [[InlineKeyboardButton("➡️ Next", callback_data="next")]]
    return InlineKeyboardMarkup(keyboard)


def button(update, context):
    query = update.effective_message
    query.answer()
    if query.data == "next":
        next(update, context)


def main():
    updater = Updater("TOKEN", use_context=True)

    dp = updater.dispatcher
    dp.add_handler(CommandHandler("start", start))
    dp.add_handler(CommandHandler("next", next))
    dp.add_handler(CallbackQueryHandler(button))

    updater.start_polling()
    updater.idle()

如果您在这方面有任何其他问题,请告诉我!

我的电报 ID 是 telegram.me/rohithaditya

在 git 上关注我 - rohith-sreedharan


推荐阅读