Python

Почему цикл не останавливается ?

Друзья, подскажите нубу, почему при попытке остановить цикл с помощью отправки сообщения СНЯТЬ С ОХРАНЫ, он продолжает идти? как можно выйти из ситуации? необходимо, чтобы цикл шел, до момента отправки команды о остановке. А сейчас цикл НЕВОЗМОЖНО остановить
А не проще ли вместе условия проверки текста сделать проверку по цифре 0 и 1?
Геннадий Степанюк
Геннадий Степанюк
71 164
Лучший ответ
Дмитрий Орловский пробовал разными способами, проверку по переменным, которым присваивал значения в зависимости от теста - не работает
Активное ожидание это не очень хорошо. Подпишись на какое-нибудь событие и в другом участке кода вызывай это событие.
А у цикла нет причин завершаться, так как сообщение не поменяется. Скорее всего, будет новое сообщение и новый вызов функции.
time.sleep работает синхронно, т.е. message.text однажды прилетев, больше не меняется, а тупо крутится в цикле. Надо выкинуть sleep...
 from threading import Timer

def func(message):
if 'Поставить на охрану' in message.text:
print('moo')

if 'Снять с охраны' in message.text:
return

Timer(1.0, func).start()
# ...(1.0, func, ['аргументы', 'если', 'есть']).start()
Либо не так, я не знаю, как там изначально вызывается func и что у него в декораторе... Можно делать дополнительную функцию, которая через Timer раз в секунду вызывает саму себя, а уже внутри той функции вызывать func и проверять значение message...
Дмитрий Орловский если из моего кода исключить полностью sleep, цикл все равно продолжает крутится при попытке остановить
Дмитрий Орловский если в моем последнем примере перед while поставить print(x), то я увижу, что x меняется в зависимости от написанного сообщения, но внутри while x остается неизменным
Как я понял, ответа тут еще нет.
Каждое сообщение - вызывает эту функцию, в которой x - локальная переменная, существующая только в этой функции.

Создай снаружи функции x = 0
В функции добавь global x
Если сообщение поставить охрану - x=10
Если снять - x=0
В цикле надо заменить time.sleep() на что-то, что не будет останавливать работу всего кода. Выше пример с потоком был, наверное рабочий
Первое - а зачем ты вообще используешь цикл в функции message?

bot.polling(none_stop=True) сам в цикле запрашивает обновления у телеграм

твой код должен выглядеть просто
 # Получение сообщений от юзера 
@bot.message_handler(content_types=["text"])
def handle_text(message):
if(message.text == "debil"):
print("sam gebil")

if (message.text == "durak"):
print("ot dyraka slyshy")

# Запускаем бота
bot.polling(none_stop=True)
Дмитрий Орловский у бота планировалось 2 режима работы.. и не понятно как включать режимы написал либо одно либо другое сообщение
Дмитрий Орловский вопрос не решен, так как в одном из режимов работы необходимо постоянно мониторить и выполнять действия c файлами, именно поэтому использовал while, if к сожалению недостаточно
Дмитрий Орловский про два режима работы, необходимо чтобы бот при отправке ПОСТАВИТЬ НА ОХРАНУ переходил к циклической последовательности действий, а при отправке СНЯТЬ С ОХРАНЫ бот выходил из этой циклической последовательности действий и не переходил к ней до тех пор, пока не будет отправлено сообщение ПОСТАВИТЬ НА ОХРАНУ
Дмитрий Орловский ничего страшного, буду рад услышать в любое удобное время) заранее спасибо