Как сделать всплывающее окно с сообщением (python-telegram-bot)
Подскажите, как вызвать всплывающее окно в телеграм боте (как на картинке ниже). Окно должно появится в ответ на нажатие пользователем inline кнопки.
Код пишу на Python с библиотекой python-telegram-bot.

Пробовала такие варианты:
context.answer_callback_query(text='Извините, это время занято, выберите другое!')Выводит ошибкуAttributeError: 'CallbackContext' object has no attribute 'answer_callback_query'update.answer_callback_query(text='Извините, это время занято, выберите другое!')Выводит ошибкуAttributeError: 'Update' object has no attribute 'answer_callback_query'bot.answer_callback_query(text='Извините, это время занято, выберите другое!')(знаю, что так используют для PyTelegramBotAPI). Ошибка:NameError: name 'bot' is not definedquery.answer_callback_query(text='Извините, это время занято, выберите другое!')Выводит ошибкуAttributeError: 'CallbackQuery' object has no attribute 'answer_callback_query'
def on_select_date(update: Update, context: CallbackContext):
global text_data
query = update.callback_query
query.answer()
bot = context.bot
selected, date = telegramcalendar.process_calendar_selection(bot, update)
if not selected:
return ConversationHandler.END
user_data = context.user_data
text_data = date.strftime("%d/%m/%Y")
user_data['Дата'] = text_data
keyboard = [[
InlineKeyboardButton("12:00", callback_data='12'),
InlineKeyboardButton("14:30", callback_data='14'),
InlineKeyboardButton("16:00", callback_data='16')
]]
reply_markup = InlineKeyboardMarkup(keyboard)
query.message.reply_text(text='''Вы выбрали %s
Выберите свободное время: ''' % text_data, reply_markup=reply_markup)
return STATE_SELECT_TIME
def check(date: str, time: str):
mycursor = mydb.cursor()
sql = "SELECT * FROM users WHERE data_time = %s"
var = (data_time, )
mycursor.execute(sql, var)
myresult = mycursor.fetchone()
return myresult
@run_async
@log_func(log)
def on_time_12(update: Update, context: CallbackContext):
global text_time
global data_time
user_data = context.user_data
text_time = '12:00'
user_data['Время'] = text_time
data_time = text_data + text_time
query = update.callback_query
query.answer()
if check(user_data['Дата'], user_data['Время']):
context.bot.answer_callback_query(callback_query_id=query.id, text='Извините, это время занято, выберите другое!', show_alert=True)
print('Найдено в бд')
else:
query.edit_message_text('''Введите своё *Имя и Фамилию*''', parse_mode='Markdown')
return STATE_SELECT_USER
def main():
# Create the EventHandler and pass it your bot's token.
updater = Updater(
token=TOKEN,
use_context=True
)
# Get the dispatcher to register handlers
dp = updater.dispatcher
dp.add_handler(CommandHandler('start', on_main_menu))
dp.add_handler(ConversationHandler(
entry_points=[
CommandHandler('start', on_main_menu),
CallbackQueryHandler(on_sing_up, pattern='sing_up')
],
states={
STATE_SELECT_TIME: [
CallbackQueryHandler(on_time_12, pattern='12'),
CallbackQueryHandler(on_time_14, pattern='14'),
CallbackQueryHandler(on_time_16, pattern='16')
],
STATE_SELECT_USER: [
MessageHandler(Filters.text, on_sing_name)
]
},
fallbacks=[
]
))
Ответы (2 шт):
Ошибки говорят полезные вещи, нужно вызывать метод answer_callback_query у bot, но чтобы достать это поле, нужно обратиться к context.
context.bot.answer_callback_query(callback_query_id=query.id, text='Извините, это время занято, выберите другое!', show_alert=True)
Нашла решение проблемы
def on_time_12(update: Update, context: CallbackContext):
query = update.callback_query
# query.answer() <--- эту строку нужно перенести в else
if check(user_data['Дата'], user_data['Время']):
query.bot.answer_callback_query(update.callback_query.id, text='Извините, это время занято, выберите другое!', show_alert=True)
else:
query.answer()
query.edit_message_text('''Введите своё *Имя и Фамилию*''', parse_mode='Markdown')
query.answer() нужно перенести в else:, чтобы не мешала работе всплывающего окна