You have to use CallbackQueryHandler to assing function to data
If you use pattern .* then it will get all data in one function
def handle_callback_query(update, context):
print(update.callback_query.data)
context.bot.send_message(chat_id=update.effective_chat.id,
text='[handle_callback_query] callback data: ' + update.callback_query.data)
dispatcher.add_handler(CallbackQueryHandler(handle_callback_query, pattern='.*'))
You can also use pattern to assing different functions
def query_yes(update, context):
print(update.callback_query.data)
context.bot.send_message(chat_id=update.effective_chat.id,
text='[query_yes] callback data: ' + update.callback_query.data)
def query_no(update, context):
print(update.callback_query.data)
context.bot.send_message(chat_id=update.effective_chat.id,
text='[query_no] callback data: ' + update.callback_query.data)
dispatcher.add_handler(CallbackQueryHandler(query_yes, pattern='^yes$'))
dispatcher.add_handler(CallbackQueryHandler(query_no, pattern='^no$'))
Minimal working example.
import os
from telegram.ext import Updater, CommandHandler, CallbackQueryHandler
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
# --- init ---
TOKEN = os.getenv('TELEGRAM_TOKEN')
updater = Updater(token=TOKEN, use_context=True)
dispatcher = updater.dispatcher
# --- commands ---
def options(update, context):
button_list = []
for each in ["yes", "no"]:
button_list.append(InlineKeyboardButton(each, callback_data=each))
reply_markup = InlineKeyboardMarkup(build_menu(button_list))
context.bot.send_message(chat_id=update.message.chat_id,
text="Option Selected:",
reply_markup=reply_markup)
def build_menu(buttons, n_cols=1, header_buttons=None, footer_buttons=None):
"""
Returns a list of inline buttons used to generate inlinekeyboard responses
:param buttons: `List` of InlineKeyboardButton
:param n_cols: Number of columns (number of list of buttons)
:param header_buttons: First button value
:param footer_buttons: Last button value
:return: `List` of inline buttons
"""
menu = [buttons[i:i + n_cols] for i in range(0, len(buttons), n_cols)]
if header_buttons:
menu.insert(0, header_buttons)
if footer_buttons:
menu.append(footer_buttons)
return menu
dispatcher.add_handler(CommandHandler('options', options))
# --- one function for all data ---
def handle_callback_query(update, context):
print(update.callback_query.data)
context.bot.send_message(chat_id=update.effective_chat.id,
text='[handle_callback_query] callback data: ' + update.callback_query.data)
#dispatcher.add_handler(CallbackQueryHandler(handle_callback_query, pattern='.*'))
# --- different functions for different data ---
def query_yes(update, context):
print(update.callback_query.data)
context.bot.send_message(chat_id=update.effective_chat.id,
text='[query_yes] callback data: ' + update.callback_query.data)
def query_no(update, context):
print(update.callback_query.data)
context.bot.send_message(chat_id=update.effective_chat.id,
text='[query_no] callback data: ' + update.callback_query.data)
dispatcher.add_handler(CallbackQueryHandler(query_yes, pattern='^yes$'))
dispatcher.add_handler(CallbackQueryHandler(query_no, pattern='^no$'))
# --- start ---
print('Starting ...')
updater.start_polling()
updater.idle()
callback. You can only assigncallbackto buttons and telegram will run thiscallbackwhen you press button. And if you want to access some value from this function then you have to put value in global variable. OR you have to run all code directly insidecallbackand use this value directly incallbacktelegram,telebotor other?