是否有在用户响应后删除 InlineKeyboardMarkup 的功能? (python-电报机器人)
Is there a function to remove InlineKeyboardMarkup after user has responded? (python-telegram-bot)
我正在寻找一种在用户响应后删除内联键盘按钮的方法。
电报机器人会在用户键入 /default 后要求用户 select 一个选项。我希望能够删除用户多次 select 响应按钮的选项。
下面是我的示例代码,我使用的是 python-telegram-bot 包。
list_default_options = ['a', 'b',
'c', 'd']
def default_options(update, context):
"""Generates responses for default options."""
button_list = []
for each in list_options:
button_list.append(InlineKeyboardButton(each, callback_data=each))
reply_markup = InlineKeyboardMarkup(build_menu(button_list, n_cols=2))
context.bot.send_message(chat_id=update.message.chat_id,
text="Choose option",
reply_markup=reply_markup)
def build_menu(buttons, n_cols=1, header_buttons=None, footer_buttons=None):
"""
Returns a list of inline buttons used to generate inlinekeyboard responses
:param buttons: `List` of InlineKeyboardButton
:param n_cols: Number of columns (number of list of buttons)
:param header_buttons: First button value
:param footer_buttons: Last button value
:return: `List` of inline buttons
"""
menu = [buttons[i:i + n_cols] for i in range(0, len(buttons), n_cols)]
if header_buttons:
menu.insert(0, header_buttons)
if footer_buttons:
menu.append(footer_buttons)
return menu
def query_default_option(update, context):
"""Callback function when inline response is selected"""
print("Default Option: " + update.callback_query.data)
context.bot.send_message(chat_id=update.effective_chat.id,
text="Registered: " + update.callback_query.data)
def main():
# Define telegram updater and dispatcher
updater = Updater(token=API_KEY, use_context=True)
dp = updater.dispatcher
# Register handlers
# Different commands or Text
dp.add_handler(CommandHandler('start', start))
dp.add_handler(MessageHandler(Filters.text & (~Filters.command),
handle_message))
dp.add_handler(CommandHandler('default', default_options))
dp.add_handler(CallbackQueryHandler(query_default_option,
pattern='^a$'))
dp.add_handler(CallbackQueryHandler(query_default_option,
pattern='^b$'))
dp.add_handler(CallbackQueryHandler(query_default_option,
pattern='^c$'))
dp.add_handler(CallbackQueryHandler(query_default_option,
pattern='^d$'))
我首先链接到另一个问题,但实际上它并没有完全回答你的问题,我也没有找到其他更清楚的答案,所以我们开始吧。
要编辑内联键盘(阅读:附加一个新键盘或将其全部删除),Bot API 提供了方法 edit_message_reply_markup
。要附加新键盘,您必须将新键盘传递给该方法。要删除它,请传递 None
.
请注意,python-telegram-bot
为此提供了方便的快捷方式,因此您不必担心从传入更新中读取 chat_id
和 message_id
。因此,要卸下键盘,您可以例如使用 update.callback_query.edit_message_reply_markup(None)
或 update.effective_message.edit_reply_markup(None)
,它们是等价的。请参阅文档 here and here. Yo might also want to have a look at the example here.
另请注意,还有一些 edit_message_*
方法,其中大部分还接受可选的 reply_markup
参数。不传递该参数(或传递 reply_markup=None
将在调用这些方法时删除键盘,但如果您只想更改键盘并保留其余消息,那么 edit_message_reply_markup
是可行的方法.
免责声明:我目前是 python-telegram-bot
.
的维护者
我正在寻找一种在用户响应后删除内联键盘按钮的方法。 电报机器人会在用户键入 /default 后要求用户 select 一个选项。我希望能够删除用户多次 select 响应按钮的选项。 下面是我的示例代码,我使用的是 python-telegram-bot 包。
list_default_options = ['a', 'b',
'c', 'd']
def default_options(update, context):
"""Generates responses for default options."""
button_list = []
for each in list_options:
button_list.append(InlineKeyboardButton(each, callback_data=each))
reply_markup = InlineKeyboardMarkup(build_menu(button_list, n_cols=2))
context.bot.send_message(chat_id=update.message.chat_id,
text="Choose option",
reply_markup=reply_markup)
def build_menu(buttons, n_cols=1, header_buttons=None, footer_buttons=None):
"""
Returns a list of inline buttons used to generate inlinekeyboard responses
:param buttons: `List` of InlineKeyboardButton
:param n_cols: Number of columns (number of list of buttons)
:param header_buttons: First button value
:param footer_buttons: Last button value
:return: `List` of inline buttons
"""
menu = [buttons[i:i + n_cols] for i in range(0, len(buttons), n_cols)]
if header_buttons:
menu.insert(0, header_buttons)
if footer_buttons:
menu.append(footer_buttons)
return menu
def query_default_option(update, context):
"""Callback function when inline response is selected"""
print("Default Option: " + update.callback_query.data)
context.bot.send_message(chat_id=update.effective_chat.id,
text="Registered: " + update.callback_query.data)
def main():
# Define telegram updater and dispatcher
updater = Updater(token=API_KEY, use_context=True)
dp = updater.dispatcher
# Register handlers
# Different commands or Text
dp.add_handler(CommandHandler('start', start))
dp.add_handler(MessageHandler(Filters.text & (~Filters.command),
handle_message))
dp.add_handler(CommandHandler('default', default_options))
dp.add_handler(CallbackQueryHandler(query_default_option,
pattern='^a$'))
dp.add_handler(CallbackQueryHandler(query_default_option,
pattern='^b$'))
dp.add_handler(CallbackQueryHandler(query_default_option,
pattern='^c$'))
dp.add_handler(CallbackQueryHandler(query_default_option,
pattern='^d$'))
我首先链接到另一个问题,但实际上它并没有完全回答你的问题,我也没有找到其他更清楚的答案,所以我们开始吧。
要编辑内联键盘(阅读:附加一个新键盘或将其全部删除),Bot API 提供了方法 edit_message_reply_markup
。要附加新键盘,您必须将新键盘传递给该方法。要删除它,请传递 None
.
请注意,python-telegram-bot
为此提供了方便的快捷方式,因此您不必担心从传入更新中读取 chat_id
和 message_id
。因此,要卸下键盘,您可以例如使用 update.callback_query.edit_message_reply_markup(None)
或 update.effective_message.edit_reply_markup(None)
,它们是等价的。请参阅文档 here and here. Yo might also want to have a look at the example here.
另请注意,还有一些 edit_message_*
方法,其中大部分还接受可选的 reply_markup
参数。不传递该参数(或传递 reply_markup=None
将在调用这些方法时删除键盘,但如果您只想更改键盘并保留其余消息,那么 edit_message_reply_markup
是可行的方法.
免责声明:我目前是 python-telegram-bot
.