Проблема, с которой вы сталкиваетесь, связана с тем, что callback_data, используемый в кнопке InlineKeyboardButton, должен быть сериализован в виде строки. При перезапуске бота или его отключении и включении callback_data теряет свое значение и не может быть правильно обработан.
Один из способов обойти эту проблему - использовать фиксированное значение в callback_data вместо использования динамического значения, такого как вызов лямбды. Например, вы можете использовать уникальный текстовый идентификатор для каждой кнопки, который не будет изменяться после перезапуска бота.
Другой способ - хранить состояние кнопок (нажатие и другую информацию) в базе данных или файле, чтобы можно было восстановить их значения после перезапуска бота. Вам понадобится добавить логику для сохранения и восстановления данных кнопок при перезапуске бота.
Чтобы избежать бесконечного вращающегося колесика на кнопке, вы можете использовать параметр switch_inline_query_current_chat вместо callback_data. switch_inline_query_current_chat позволяет боту отправить текстовое сообщение от имени пользователя и позволяет обрабатывать запросы, выдаваемые по кнопке, обычными декораторами.
Вот пример кода, который может помочь вам обойти проблему:
```python
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater, CallbackQueryHandler
# Для хранения состояний кнопок можете использовать базу данных или файл
def start(update, context):
keyboard = [[InlineKeyboardButton("Button 1", callback_data="button1")],
[InlineKeyboardButton("Button 2", callback_data="button2")]]
reply_markup = InlineKeyboardMarkup(keyboard)
update.message.reply_text('Please choose:', reply_markup=reply_markup)
def button_click(update, context):
query = update.callback_query
query.answer()
if query.data == "button1":
query.edit_message_text("Button 1 clicked!")
elif query.data == "button2":
query.edit_message_text("Button 2 clicked!")
def main():
updater = Updater('YOUR_TOKEN', use_context=True)
dp = updater.dispatcher
dp.add_handler(CallbackQueryHandler(button_click))
dp.add_handler(CommandHandler('start', start))
updater.start_polling()
updater.idle()
if __name__ == '__main__':
main()
```
Это пример кода, который демонстрирует использование InlineKeyboardButton и обработку нажатий на кнопки. В данном примере состояния кнопок не сохраняются, но вы можете добавить логику для сохранения и восстановления состояния по мере необходимости.