如何使用 InlinKeyBoardMarkup 有多种方法 - 电报机器人
How to have multiple methods with InlinKeyBoardMarkup - telegram bot
我正在尝试使用 2 种快速回复的方法。这两种方法是 cmd_language 和 cmd_crypto。问题是第一种方法(cmd_language)效果很好,但第二种方法不行。
我希望程序像这样工作:
我键入 /start,键入“欢迎”,然后自动执行 cmd_language,显示“Select 语言”和选项(目前有效)。然后我输入 /crypto,显示了选项,但是当我 select 一个选项时,我得到一个错误。
from telegram.ext import *
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
#-------------------- START ------------------------
def cmd_start(update, context:CallbackContext):
update.message.reply_text("Welcome")
cmd_language(update, context)
#-------------------LANGUAGE---------------------------
def cmd_language(update, context:CallbackContext):
languages= [[InlineKeyboardButton("Español", callback_data="ES")],
[InlineKeyboardButton("English", callback_data="EN")]]
menuLanguages = InlineKeyboardMarkup(languages)
update.message.reply_text("Select the language", reply_markup=menuLanguages)
def selectionLanguage(update, context):
query = update.callback_query
language = query.data
query.edit_message_text(text=f"You have selected {language}")
#-----------------------CRYTO-------------------
def cmd_crypto(update, context:CallbackContext):
cryptos= [[InlineKeyboardButton("ADA - Cardano", callback_data="ADA")],
[InlineKeyboardButton("BTC - Bitcoin", callback_data="BTC")]]
menuCryptos= InlineKeyboardMarkup(cryptos)
update.message.reply_text("Select the cryptocurrency:", reply_markup=menuCryptos)
def selectionCrypto(update, context):
query = update.callback_query
crypto= query.data
query.edit_message_text(text=f"You have selected {crypto}"))
#----------------ERROR-------------------------
def error(update, context):
print(f"Update {update} caused error {context.error}")
#--------------MAIN-------------------------------
def main():
updater = Updater("TOKEN", use_context=True)
dp = updater.dispatcher
dp.add_handler(CommandHandler("start", cmd_start))
dp.add_handler(CommandHandler("language", cmd_language))
dp.add_handler(CallbackQueryHandler(selectionLanguage))
dp.add_handler(CommandHandler("crypto", cmd_crypto))
dp.add_handler(CallbackQueryHandler(selectionCrypto))
dp.add_error_handler(error)
updater.start_polling()
updater.idle()
if __name__ == "__main__":
main()
这里的关键部分是 Dispatcher.add_handler
文档中的“订单和优先级计数”行:您的第一个 CallbackQueryHandler
将只处理 任何 传入CallbackQuery
第二个永远不会被解雇。
作为问题的解决方案,我建议:
- 使用
CallbackQueryHandler
或 的pattern
参数
- 使用
ConversationHandler
在多步骤设置中获取用户输入。
请查看 inlinekeyboard2.py
示例,其中展示了两者。
免责声明:我目前是 python-telegram-bot
.
的维护者
我正在尝试使用 2 种快速回复的方法。这两种方法是 cmd_language 和 cmd_crypto。问题是第一种方法(cmd_language)效果很好,但第二种方法不行。
我希望程序像这样工作: 我键入 /start,键入“欢迎”,然后自动执行 cmd_language,显示“Select 语言”和选项(目前有效)。然后我输入 /crypto,显示了选项,但是当我 select 一个选项时,我得到一个错误。
from telegram.ext import *
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
#-------------------- START ------------------------
def cmd_start(update, context:CallbackContext):
update.message.reply_text("Welcome")
cmd_language(update, context)
#-------------------LANGUAGE---------------------------
def cmd_language(update, context:CallbackContext):
languages= [[InlineKeyboardButton("Español", callback_data="ES")],
[InlineKeyboardButton("English", callback_data="EN")]]
menuLanguages = InlineKeyboardMarkup(languages)
update.message.reply_text("Select the language", reply_markup=menuLanguages)
def selectionLanguage(update, context):
query = update.callback_query
language = query.data
query.edit_message_text(text=f"You have selected {language}")
#-----------------------CRYTO-------------------
def cmd_crypto(update, context:CallbackContext):
cryptos= [[InlineKeyboardButton("ADA - Cardano", callback_data="ADA")],
[InlineKeyboardButton("BTC - Bitcoin", callback_data="BTC")]]
menuCryptos= InlineKeyboardMarkup(cryptos)
update.message.reply_text("Select the cryptocurrency:", reply_markup=menuCryptos)
def selectionCrypto(update, context):
query = update.callback_query
crypto= query.data
query.edit_message_text(text=f"You have selected {crypto}"))
#----------------ERROR-------------------------
def error(update, context):
print(f"Update {update} caused error {context.error}")
#--------------MAIN-------------------------------
def main():
updater = Updater("TOKEN", use_context=True)
dp = updater.dispatcher
dp.add_handler(CommandHandler("start", cmd_start))
dp.add_handler(CommandHandler("language", cmd_language))
dp.add_handler(CallbackQueryHandler(selectionLanguage))
dp.add_handler(CommandHandler("crypto", cmd_crypto))
dp.add_handler(CallbackQueryHandler(selectionCrypto))
dp.add_error_handler(error)
updater.start_polling()
updater.idle()
if __name__ == "__main__":
main()
这里的关键部分是 Dispatcher.add_handler
文档中的“订单和优先级计数”行:您的第一个 CallbackQueryHandler
将只处理 任何 传入CallbackQuery
第二个永远不会被解雇。
作为问题的解决方案,我建议:
- 使用
CallbackQueryHandler
或 的 - 使用
ConversationHandler
在多步骤设置中获取用户输入。
pattern
参数
请查看 inlinekeyboard2.py
示例,其中展示了两者。
免责声明:我目前是 python-telegram-bot
.