@denisland

Не меняется параметр call.data в тг-боте, почему и где я допустил ошибку?

параметр call.data после повторного выбора пользователя не меняется, а как будто запоминает первые данные. не могу понять в чем ошибка и как ее могу исправить.
сам код:

@dp.message_handler(commands=['start'])
async def start(message: types.Message):
	print('test')
	markup = types.InlineKeyboardMarkup()
	markup.add(types.InlineKeyboardButton('BMW', callback_data=2))#2
	markup.add(types.InlineKeyboardButton('Benz', callback_data=3))#3
	markup.add(types.InlineKeyboardButton('Audi', callback_data=4))#4
@dp.callback_query_handler()
async def callback(call):
	await call.message.answer(f'Понял Принял! Теперь напиши пожалуйста, в каком городе будем смотреть {call.data}')
	print(call.data)
	@dp.message_handler(content_types=['text'])
	async def city(message: types.Message):
		global town
		markup2 = types.ReplyKeyboardMarkup(one_time_keyboard=True)
		markup2.add(types.KeyboardButton('Да!'))
		markup2.add(types.KeyboardButton('Нет, хочу изменить параметры поиска'))
		if message.text == 'Вена':
			await message.answer(f'Итак, ты хочешь посмотреть {call.data} в городе {message.text}, верно?', reply_markup=markup2)
			town = message.text
			print(call.data)
		elif message.text == 'Прага':
			await message.answer(f'Итак, ты хочешь посмотреть {call.data} в городе {message.text}, верно?', reply_markup=markup2)
			town = message.text
		elif message.text == 'Мюнхен':
			await message.answer(f'Итак, ты хочешь посмотреть {call.data} в городе {message.text}, верно?', reply_markup=markup2)
			town = message.text
		elif message.text == 'Да!':
			with sqlite3.connect ('database.db') as connection:
				cursor = connection.cursor()
				cursor.execute("""
					SELECT * FROM DataBase WHERE Category == (?) AND City == (?)
					""", (call.data, town, ))
				result = cursor.fetchall()
				print(result)
		elif message.text == 'Нет, хочу изменить параметры поиска':

			await start(message)

		else:
				await message.answer('К сожалению, у нас нет данных из этого населенного пункта')
  • Вопрос задан
  • 89 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
@dp.callback_query_handler()
async def callback(call):
  await call.message.answer(f'Понял Принял! Теперь напиши пожалуйста, в каком городе будем смотреть {call.data}')
  print(call.data)
  @dp.message_handler(content_types=['text'])  # обработчик событий объявлен внутри другого?
  async def city(message: types.Message):

Это НЕ будет работать так, как ты ожидаешь. При каждом выполнении callback() будет попытка добавить ещё один обработчик, но предыдущие обработчики так и останутся. А поскольку вызывается обычно только самый первый обработчик, то только самый первый вариант и будет обрабатываться.

Открой для себя Finite State Machine, ну и в целом получи хоть какое-то представление как работает используемая тобой библиотека, что в ней можно делать, а что нельзя.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы