python-telegram-bot - 如何使用 CallbackQueryHandler 按钮函数更改对话处理程序状态
问题描述
我有一个 python 电报机器人,它可以像这样发送带有按钮的消息:
keyboard = [[telegram.InlineKeyboardButton("Finish", callback_data='1'),
telegram.InlineKeyboardButton("Edit", callback_data='2')]]
update_obj.message.reply_text(message_text, reply_markup=reply_markup,
parse_mode=telegram.ParseMode.MARKDOWN)
现在,当用户点击“编辑”按钮时,我希望 ConversationHandler 移动到另一个状态。这是我的 ConversationHandler 的一部分:
WELCOME = 0
SEARCH = 2
EDITTITLE = 3
[...]
handler = telegram.ext.ConversationHandler(
entry_points=[telegram.ext.CommandHandler('start', start)],
states={
WELCOME: [
telegram.ext.MessageHandler(filters=telegram.ext.Filters.all, callback=welcome),
updater.dispatcher.add_handler(telegram.ext.CallbackQueryHandler(button))
],
SEARCH: [
telegram.ext.MessageHandler(filters=telegram.ext.Filters.all, callback=search),
updater.dispatcher.add_handler(telegram.ext.CallbackQueryHandler(button))
], EDITTITLE: [
telegram.ext.MessageHandler(filters=telegram.ext.Filters.all, callback=editTitle)
]
[...]
现在通常我可以从 MessageHandler 的回调函数中返回新状态,如下所示:
def search(update_obj, context):
[...]
return WELCOME
但是,如果我在按钮功能中返回新状态,它不会切换到该状态。这是代码:
def button(update_obj, context):
[...]
return EDITTITLE
如何使按钮更改 ConversationHandler 状态,或者我缺少什么?我是否以正确的方式使用按钮?
谢谢 :)
解决方案
您在CallbackQueryHandlers
对话中添加了错误的内容。updater.dispatcher.add_handler(telegram.ext.CallbackQueryHandler(button))
返回None
,因此None
将添加到状态WELCOME
和的处理程序列表中SEARCH
。相反,它应该只是telegram.ext.CallbackQueryHandler(button)
. 可能还有其他问题,但我必须看到一个完整的最小工作示例来判断。
免责声明:我目前是python-telegram-bot
.
推荐阅读
- arrays - 在 Rails 中,如何按数组字段中的元素计数进行分组?
- apache-kafka - 在 Flink 中实时更新序列化模式
- c - C中char数组的最后一个字符
- curl - 为什么 38189 应要求
- c# - 当我尝试在 C# WinForms 中打开第二个表单时,声音播放器中出现白噪声
- java - 使用 CUDA 运行 Dl4j 的问题
- cassandra - Cassandra 一个种子节点显示出集群
- rust - 从 `futures::stream::SelectAll` 中删除一个流
- python - Python 模块已安装,并且在正确的站点包中,但仍未找到。知道如何解决这个问题吗?
- javascript - 已禁用但也已检查