bot.register_next_step_handler Каким образом передать несколько функций одновременно?

rosvo

Новичок
Пользователь
Дек 29, 2021
10
0
1
Доброго времени суток, буду благодарен за помощь.
Проблема следующая: есть функции def rest1(message) и def rest2(message). Каким образом в bot.register_next_step_handler передать одновременно rest1 и rest2 ? Одна функция , н-р. rest1 передается следующим образом : bot.register_next_step_handler(msg, rest1) и все работает , но с двумя и более функциями не знаю, как работать. Заранее спасибо за помощь.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Проблема следующая: есть функции def rest1(message) и def rest2(message). Каким образом в bot.register_next_step_handler передать одновременно rest1 и rest2 ? Одна функция , н-р. rest1 передается следующим образом : bot.register_next_step_handler(msg, rest1) и все работает , но с двумя и более функциями не знаю, как работать
Если функции rest1 и rest2 должны выполняться последовательно, то можно вызывать rest2 из rest1 также с помощью bot.register_next_step_handler(msg, rest2).
Вот пример из документации pyTelegramBotAPI: ссылка.
 
  • Мне нравится
Реакции: rosvo

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Функции rest1 и rest2[/ICODE не должны выполняться последовательно, это callback_data в кнопках InlineKeyboard.
callback_data обычно строка, а не функция. Она передается в обработчик и в зависимости от ее значение выполняется то или иное действие.
Можете показать код (минимальный рабочий пример) и написать что он должен делать.
 
  • Мне нравится
Реакции: rosvo

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вот здесь надо передать одновременно несколько функций, а именно в данном случае rest1 и rest2
По данному коду не понятно что он делает и он не запускается.
Можно только предположить что вы пытаетесь сделать что-то вроде такого: пользователь вводит команду (например /start), бот показывает ему клавиатуру с выбором из двух вариантов, после выбора одного из которых пользователю отправляется одна картинка либо другая.
В общем нужен код который можно запустить с комментариями что нужно в нем доделать или опишите словами полную логику работы бота.
 
  • Мне нравится
Реакции: rosvo

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Проблема в том, что отдельные клавиатуры ReplyKeyboard , соответственно keyboard.rest1 или keyboard.rest2, открываются, но информация подтягивается лишь из rest1.
Можно попробовать прописать bot.register_next_step_handler() в обработчике в зависимости от callback_data, а в методе main закомментировать:
Python:
@bot.message_handler(content_types =['text', 'contact'])
def main(message):
    if message.text == 'ℹ О Сервисе':
        bot.send_message(message.chat.id, '.......................)
        msg = bot.send_message(message.chat.id, 'Выберите,пожалуйста, действие ⤵')
        bot.register_next_step_handler(msg, main)
    elif message.text == '? Выбрать Ресторан':
        msg = bot.send_message(message.chat.id, 'Выберите,пожалуйста, действие ⤵', reply_markup=keyboard.rest_markup)
        # bot.register_next_step_handler(msg, rest1)
Python:
@bot.callback_query_handler(func=lambda call: True)
def handler_call(call):
    chat_id = call.message.chat.id
    message_id = call.message.message_id

    if call.data == 'rest1':
        bot.send_message(call.message.chat.id, 'Выберите,пожалуйста, действие ⤵', reply_markup=keyboard.rest1())
        bot.register_next_step_handler(call.message, rest1)
    if call.data == 'rest2':
        bot.send_message(call.message.chat.id, 'Выберите,пожалуйста, действие ⤵', reply_markup=keyboard.rest2())
        bot.register_next_step_handler(call.message, rest2)
 
  • Мне нравится
Реакции: rosvo

Ципихович Эндрю

Активный пользователь
Пользователь
Мар 27, 2021
490
26
28
гуглите примеров полно, потоковая передача:
Код:
from threading import Thread

def func1():
    print('Working_func1')

def func2():
    print("Working_func2")

if __name__ == '__main__':
    Thread(target = func1).start()
    Thread(target = func2).start()
и приписки в них, что не факт, что выиграете по скорости, так что нужно переезжать как я понимаю на go, он с 2000-х годов, а питон-1991 год, тогда об этом, об потоковой передаче не думали
 
  • Мне нравится
Реакции: rosvo

rosvo

Новичок
Пользователь
Дек 29, 2021
10
0
1
Если функции rest1 и rest2 должны выполняться последовательно, то можно вызывать rest2 из rest1 также с помощью bot.register_next_step_handler(msg, rest2).
Вот пример из документации pyTelegramBotAPI: ссылка.
Спасибо за ответ. Функции rest1 и rest2[/ICODE не должны выполняться последовательно, это callback_data в кнопках InlineKeyboard.
 

rosvo

Новичок
Пользователь
Дек 29, 2021
10
0
1
callback_data обычно строка, а не функция. Она передается в обработчик и в зависимости от ее значение выполняется то или иное действие.
Можете показать код (минимальный рабочий пример) и написать что он должен делать.
Вот здесь надо передать одновременно несколько функций, а именно в данном случае rest1 и rest2
:
msg = bot.send_message(message.chat.id, 'Выберите,пожалуйста, действие ⤵', reply_markup=keyboard.rest_markup)
bot.register_next_step_handler(msg, rest1)

@bot.callback_query_handler(func=lambda call: True)
def handler_call(call):
chat_id = call.message.chat.id
message_id = call.message.message_id

try:
if call.data == 'rest1':
bot.send_message(call.message.chat.id, 'Выберите,пожалуйста, действие ⤵', reply_markup=keyboard.rest1())

if call.data == 'rest2':
bot.send_message(call.message.chat.id, 'Выберите,пожалуйста, действие ⤵', reply_markup=keyboard.rest2())

def rest1(message):
if message.text == '? Меню':
bot.send_photo(message.chat.id, PHOTO_ZA1)
send = bot.send_message(message.chat.id, 'Выберите,пожалуйста, действие ⤵', reply_markup=keyboard.rest1())
bot.register_next_step_handler(send, rest1)

def rest2(message):
if message.text == '? Меню':
bot.send_photo(message.chat.id, PHOTO_ZA2)
send = bot.send_message(message.chat.id, 'Выберите,пожалуйста, действие ⤵', reply_markup=keyboard.rest2())
bot.register_next_step_handler(send, rest2)
 

rosvo

Новичок
Пользователь
Дек 29, 2021
10
0
1
По данному коду не понятно что он делает и он не запускается.
Можно только предположить что вы пытаетесь сделать что-то вроде такого: пользователь вводит команду (например /start), бот показывает ему клавиатуру с выбором из двух вариантов, после выбора одного из которых пользователю отправляется одна картинка либо другая.
В общем нужен код который можно запустить с комментариями что нужно в нем доделать или опишите словами полную логику работы бота.
Логика этой части бота :

1. Нажатие на кнопку "Выбрать Ресторан" вызывает InlineKeyboard keyboard.rest_markup, в котором есть кнопки "rest1" и "rest2".

@bot.message_handler(content_types =['text', 'contact'])
def main(message):

elif message.text == 'ℹ О Сервисе':
bot.send_message(message.chat.id, '.......................)
msg = bot.send_message(message.chat.id, 'Выберите,пожалуйста, действие ⤵')
bot.register_next_step_handler(msg, main)
elif message.text == '? Выбрать Ресторан':
msg = bot.send_message(message.chat.id, 'Выберите,пожалуйста, действие ⤵', reply_markup=keyboard.rest_markup)
bot.register_next_step_handler(msg, rest1)

2. После нажатия на кнопку "rest1" или "rest2" открывается отдельное меню ReplyKeyboard , соответственно keyboard.rest1 или keyboard.rest2 , при нажатии на которое вызывается информация, соответствующая rest1 или rest2:

@bot.callback_query_handler(func=lambda call: True)
def handler_call(call):
chat_id = call.message.chat.id
message_id = call.message.message_id

try:
if call.data == 'rest1':
bot.send_message(call.message.chat.id, 'Выберите,пожалуйста, действие ⤵', reply_markup=keyboard.rest1())

if call.data == 'rest2':
bot.send_message(call.message.chat.id, 'Выберите,пожалуйста, действие ⤵', reply_markup=keyboard.rest2())

def rest1(message):
if message.text == '? Меню':
bot.send_photo(message.chat.id, PHOTO_ZA1)
send = bot.send_message(message.chat.id, 'Выберите,пожалуйста, действие ⤵', reply_markup=keyboard.rest1())
bot.register_next_step_handler(send, rest1)

def rest2(message):
if message.text == '? Меню':
bot.send_photo(message.chat.id, PHOTO_ZA2)
send = bot.send_message(message.chat.id, 'Выберите,пожалуйста, действие ⤵', reply_markup=keyboard.rest2())
bot.register_next_step_handler(send, rest2)

Проблема в том, что отдельные клавиатуры ReplyKeyboard , соответственно keyboard.rest1 или keyboard.rest2, открываются, но информация подтягивается лишь из rest1.
 

rosvo

Новичок
Пользователь
Дек 29, 2021
10
0
1
Отлично, огромное спасибо, все работает:)(y)
 

Форум IT Специалистов