我想使用InlineKeyboardMarkup
创建一个多选菜单,用户可以一次选择多个内容,然后按下另一个按钮来保存信息。继续对话,就像复选框表单一样。
这是我想象的逻辑,如果query.data
仍然不是"continue"
,while循环将继续更新temp
,如您所见。
async def select_subjects(update: Update, context: ContextTypes) -> str:
temp = {}
query = update.callback_query
while query.data != "continue":
await query.answer()
if query.data in temp:
temp[query.data] = False
else:
temp[query.data] = True
query = update.callback_query
return "next"
问题是,如果我试图在"continue"
之前单击一些按钮,它会出现以下错误:
telegram.error.BadRequest: Query is too old and response timeout expired or query id is invalid
并且temp
保持为空。你能帮我吗?
好的,所以也多亏了CallMeStag的帮助,我找到了这个问题的解决方案,它包括使用python-telegram-bot
的context.user_data
功能,如下所示。这是在中首先显示选项(或本例中的主题(的功能
async def display_subjects(update: Update, context: ContextTypes) -> str:
query = update.callback_query
await query.answer()
# Fuction that returns a simple example of a dict
# {"Maths": False, "Science": False, "Art": False}
subject_list = find_subjects()
for i in subject_list:
# Every subject in the dict is now put into the context.user_data with
# the False forced value
context.user_data[i] = False
await query.edit_message_text(SUBJECT_LIST, reply_markup=keyboard(subject_list))
return "select_subjects"
这就是管理user_data
的更新的功能。
async def select_subjects(update: Update, context: ContextTypes) -> str or int:
query = update.callback_query
await query.answer()
if query.data != "continue":
if not context.user_data[query.data]:
context.user_data[query.data] = True
elif context.user_data[query.data]:
context.user_data[query.data] = False
subjects_list = context.user_data
await query.edit_message_reply_markup(keyboard(subjects_list))
return "select_subjects"