Python-telegram-bot:实现Inline键盘点击后隐藏再重现
实现Telegram机器人骰子滚动时隐藏并重现Inline键盘
需求说明
点击Inline键盘按钮后,向用户发送🏀骰子,同时隐藏键盘防止用户在骰子滚动时误操作,待骰子滚动完成后重新显示原有Inline键盘。
现有代码
掷骰子代码
value = await update.callback_query.message.reply_dice(update.effective_message.chat_id, emoji= '🏀') dice_value = valore.dice.value
注:原代码存在变量名笔误,valore应为value
键盘定义代码
keyboard_basketDemo = [ [ InlineKeyboardButton("⚙ 投注设置 🍕", callback_data="SettingsDemoBet"), InlineKeyboardButton("投球", callback_data="basketDemo"), ], ]
实现方案
核心思路是通过编辑原消息的回复标记,先移除键盘,待骰子动画结束后再恢复键盘,具体步骤如下:
- 隐藏键盘:触发掷骰子操作时,调用
edit_message_reply_markup将原消息的Inline键盘设为None,实现隐藏效果。 - 等待骰子动画结束:发送骰子后,通过
wait_for监听消息更新事件,直到Telegram返回包含最终点数的骰子消息(动画结束后dice.value会被填充)。 - 重现键盘:确认骰子结果生成后,再次调用
edit_message_reply_markup恢复原有的Inline键盘。
完整代码示例
from telegram import InlineKeyboardMarkup, InlineKeyboardButton from telegram.ext import CallbackContext async def handle_basket_demo(update, context: CallbackContext): # 获取触发回调的原消息 original_msg = update.callback_query.message # 1. 隐藏原消息的Inline键盘 await original_msg.edit_reply_markup(reply_markup=None) # 2. 发送骰子消息 dice_msg = await original_msg.reply_dice(chat_id=update.effective_chat.id, emoji='🏀') # 等待骰子动画结束,获取最终点数 updated_msg = await context.bot.wait_for( 'message_update', timeout=10, # 设置超时避免无限等待 filter=lambda upd: upd.effective_message.message_id == dice_msg.message_id and upd.effective_message.dice.value is not None ) dice_value = updated_msg.effective_message.dice.value # 3. 重新显示原Inline键盘 await original_msg.edit_reply_markup(reply_markup=InlineKeyboardMarkup(keyboard_basketDemo)) # 可选:告知用户骰子结果 await update.effective_chat.send_message(f"投出了{dice_value}点!")
注意事项
- 确保使用的python-telegram-bot版本支持
wait_for方法(v13及以上版本可用) - 超时时间可根据实际网络情况调整,避免因延迟导致等待失败
- 若原消息是通过Bot发送的,确保Bot拥有编辑该消息的权限
内容的提问来源于stack exchange,提问作者Raysuoo
相关产品推荐
相关产品推荐

