@HowMeNeedToDO

Из за чего команда 9Abelora выполняется первее чем raspisanie?

Когда я пишу команду raspisanie и нажимаю на кнопку расписание 10А, мне фото не отправляется, а выполняется else команды 9Abelora
63826a2b7d109979456363.png
Как это можно исправть подскажите пожалуйста. Сам новичок в это, 3 день

@bot.message_handler(commands=['9Abelora'])
def tenA(message):
	markup = types.InlineKeyboardMarkup(row_width=1)
	item1 = types.InlineKeyboardButton("Домашнее задание на завтра", callback_data='dztom')
	item2 = types.InlineKeyboardButton("Домашнее задание за всю неделю", callback_data='dzallweek')
	item3 = types.InlineKeyboardButton("Что задали сегодня?", callback_data='today')

	markup.add(item1, item2, item3)
	bot.send_message(message.chat.id, 'Что ты хочешь узнать?', reply_markup=markup)

#Inline клавиатура:
#ДОМАШНЕЕ ЗАДАНИЕ И РАСПИСАНИЕ
@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
		if call.message:
			if call.data == 'dztom':
				bot.send_message(call.message.chat.id, 'Вот домашнее задание на завтра: 1.Русский: упр140; 2.Алгебра: №140')


			elif call.data == 'dzallweek':
				bot.send_message(call.message.chat.id, 'Вот домашнее задание за всю неделю:')

			else:
				bot.send_message(call.message.chat.id, 'Вот домашнее задание за сегодня:')

			bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Хорошо.",
				reply_markup=None)


@bot.message_handler(commands=['raspisanie'])
def tenA(message):
	markup = types.InlineKeyboardMarkup(row_width=1)
	item1 = types.InlineKeyboardButton("Расписание 10А", callback_data='dzto')
	item2 = types.InlineKeyboardButton("Домашнее задание за всю неделю", callback_data='dzallweek')
	item3 = types.InlineKeyboardButton("Расписание 9Б", callback_data='today')

	markup.add(item1, item2, item3)
	bot.send_message(message.chat.id, 'Что ты хочешь узнать?', reply_markup=markup)

#Inline клавиатура:
#ДОМАШНЕЕ ЗАДАНИЕ И РАСПИСАНИЕ
@bot.callback_query_handler(func=lambda call: True)
def raspisanie(call):
		if call.message:
			if call.data == 'dzto':
				photka = open('icon351.png', 'rb')
				bot.send_photo(call.message.chat.id, photka)

			elif call.data == 'dzallweek':
				bot.send_message(call.message.chat.id, 'Вот домашнее задание за всю неделю:')

			elif call.data == 'today':
				photi = open('icon351.png', 'rb')
				bot.send_photo(call.message.chat.id, photi)

			bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Хорошо.",
				reply_markup=None)
  • Вопрос задан
  • 53 просмотра
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Изучай документацию, а не "уроки" с ютуба.
@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
   ...

func принимает функцию, которая должна по параметру call (сведения о нажатии кнопки) определить, будет ли данный обработчик обрабатывать это нажатие. Соответственно, функция вида lambda call: True всегда будет отвечать "да, я буду обабатывать!".

При этом бот вызовет первый "согласившийся" обработчик, и ТОЛЬКО его. Как следствие, наличие одного обработчика с func=lambda call: True блокирует все нижележащие обработчики, так как этот "всеядный" обработчик будет брать на себя все нажатия кнопок (независимо от того, понимает ли он их). До остальных обработчиков дело просто не дойдёт.

Чтобы это разрулить, надо прописывать не lambda call: True, а функцию, которая реально будет различать, какой набор кнопок у пользователя, и какая кнопка была нажата. Самый простой способ это сделать - сделать этакую иерархию в строке call.data. Например:
9a.tomorrow
9a.week
9a.today
10a.tomorrow
10a.week
10a.today

Тогда ты сможешь прописать обработчики вида:
@bot.callback_query_handler(func=lambda call: call.data.startswith('10a.'))
def callback_inline_for_10a(call):
   ...  # тут обрабатываем кнопки для 10А

@bot.callback_query_handler(func=lambda call: call.data.startswith('9a.'))
def callback_inline_for_9a(call):
   ...  # тут обрабатываем кнопки для 9А


Ну а создание кнопок, соответственно, будет иметь вид
item1 = types.InlineKeyboardButton("Домашнее задание на завтра", callback_data='10a.tomorrow')
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы