如何在python电报机器人程序中使用内联查询进行多选菜单(理论)



我想使用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-botcontext.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"

最新更新