我希望使用InlineKeyboardMarkup
创建一个多选择菜单,用户可以在其中一次选择多个东西,然后按另一个按钮来保存对话中的信息,比如复选框表单。
这是我想象中的逻辑,其中如果temp
仍然不是"continue"
的话,while循环将继续更新一个"continue"
,如您所见。
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
仍然是空的。你能帮帮我吗?
发布于 2022-09-08 14:11:29
好的,同样感谢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"
https://stackoverflow.com/questions/73572463
复制相似问题