@gargamel1

Работа с несколькими клавиатурами telebot?

Работаю с ботом расписания. Должен по идее чекать коллбэк с клавиатуры квантумов, потом с клавиатуры групп и парсить документ в поисках строки с нужной группой, после чего записывать содержание строки с необходимой группой в список. Вот код:
import telebot
import config
import random
import openpyxl

from telebot import types

bot = telebot.TeleBot(config.TOKEN)
wb = openpyxl.reader.excel.load_workbook(filename="timetable.xlsx")

#Генератор кнопок из списка финкцией, sheet_num - для выбора страницы сканирования

def day_btns(groups):
	days = types.InlineKeyboardMarkup(row_width=2)
	days.add(*[types.InlineKeyboardButton(text=groups[i],callback_data=groups[i]) for i in range(len(groups))])
	return days

def kvants(kvantyms):
	InlineKvantsButtom = types.InlineKeyboardMarkup(row_width=2)
	InlineKvantsButtom.add(*[types.InlineKeyboardButton(text=kvantyms[i],callback_data=kvantyms[i]) for i in range(len(kvantyms))])
	return InlineKvantsButtom


@bot.message_handler(commands=['start'])
def welcome(message):
	sti = open('welcome.tgs', 'rb')
	bot.send_sticker(message.chat.id, sti)

	# keyboard
	markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
	item1 = types.KeyboardButton("Расписание")

	markup.add(item1)

	bot.send_message(message.chat.id, "Добро пожаловать, {0.first_name}!\n <b>Мы - команда Ярославского Кванториума.</b> \n Этот бот позволит:\nСвязаться с нами\nУзнать расписание занятий".format(message.from_user, bot.get_me()),
		parse_mode='html', reply_markup=markup)


#основной перебор всех команд
@bot.message_handler(content_types=['text'])
def lalala(message):
	if message.chat.type == 'private':
		if message.text == 'Расписание':
		
			kvantyms = []

			for i in range(len(wb.sheetnames)):
				kvantyms.append(wb.sheetnames[i])
			bot.send_message(message.chat.id, 'Выберите Квантум', reply_markup=kvants(kvantyms))

	else:


			bot.send_message(message.chat.id, 'Я не знаю что ответить ')


#этот блок выполнится если юзер отправит боту сообщение
@bot.message_handler(func=lambda c:True, content_types=['text'])
def info_message(message):
    bot.edit_message_reply_markup(message.chat.id, message_id = message.message_id-1, reply_markup = '')# удаляем кнопки у последнего сообщения


#обработка callback с больших кнопок расписания
@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
	try:
		if call.message:
			#обработка callback с больших кнопок расписания
			i = 0
			while call.data != wb.sheetnames[i]:
				i+=1
			wb.active = i
			stop = i
			groups = [ ]
			smthe = wb.active.cell(row=4, column=2).value
			smth = smthe[0] + smthe[1]
			for i in range(1, 40):
				if wb.active.cell(row=i, column=2).value != None and smth in wb.active.cell(row=i, column=2).value:
					groups.append(wb.active.cell(row=i, column=2).value)

			bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Выберите группу",
			reply_markup=day_btns(groups))

			#обработка микрокнопок групп
			wb.active = stop
			t=1
			while wb.active.cell(row=t, column=2).value != call.data:
				t+=1
			lessons = [ ]
			for i in range(3, 10):
				lessons.append(wb.active.cell(row=t, column=i).value)

			

	except Exception as e:
		print(repr(e))

# RUN
bot.polling(none_stop=True)

Сначала появляется 1я ошибка:
IndexError('list index out of range')
Cпустя время появляется и вторая:
ValueError('Row numbers must be between 1 and 1048576')

Помогите пожалуйста, почему так происходит, что и где поменять? Кстати, от конструкции проверки callback с помощью пелёнки ifов пришлось отказаться в пользу адаптивности бота под изменяющееся расписание
  • Вопрос задан
  • 148 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

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