Блокировка клавиатуры не работает, как я думал, должна знать, почему и как исправить

#python #loops #exception #keyboardinterrupt

Вопрос:

Я построил хронометр с помощью python, сначала довольно простой, а затем добавил команду «пауза/возобновление». Итак, в первом отрывке KeyboardInterrupt работает просто отлично, но когда я перезапускаю процесс, он перезапускается, переходит в цикл, но когда я прерываю выполнение, он просто завершает программу, не переходя к предыдущему оператору и далее. Я хочу понять, почему это происходит, пожалуйста, напишите код ниже: я немного изменился после ответа здесь, но это тоже не сработало. Поэтому я передаю измененный код ниже моего первоначального кода.

«‘питон

 def start_chronometer(passed: float = 0):

    import time
    beginning = time.time()
    n = 0
    try:
        while True:
            n  = 1
    except KeyboardInterrupt:
        past = (time.time() - beginning)   passed
        possibilities = ['Y', 'N']
        while (choice := input('Wish to resume counting ? y - Yes / n - No: ').title()) not in possibilities:
            print('Valor precisa ser "s" ou "n"')
        if choice == possibilities[0]:
            start_chronometer(passed=past)
        else:
            if 60 <= past < 3600:
                print(f'The time passed since the beginning of the counting was: {past / 60} minutes')
            elif 3600 <= past:
                print(f'The time passed since the beginning of the counting was: {past / 3600} hours')
            else:
                print(f'The time passed since the beginning of the counting was: {past} seconds')


start_chronometer()


def start_chronometer(passed: float = 0):
    while True:
        aux = passed
        import time
        beginning = time.time()
        n = 0
        try:
            while True:
                n  = 1
        except KeyboardInterrupt:
            past = (time.time() - beginning)   aux
            possibilities = ['Y', 'N']
            while (choice := input('Wish to resume counting ? y - Yes / n - No: ').title()) not in possibilities:
                print('Valor precisa ser "s" ou "n"')
            if choice == possibilities[0]:
                passed = past
                pass
            else:
                break
    if 60 <= past < 3600:
        print(f'The time passed since the beginning of the counting was: {past / 60} minutes')
    elif 3600 <= past:
        print(f'The time passed since the beginning of the counting was: {past / 3600} hours')
    else:
        print(f'The time passed since the beginning of the counting was: {past} seconds')
 

start_chronometer()

»’

Комментарии:

1. не могу воспроизвести проблему, пожалуйста, будьте более конкретны

2. когда я перезапущу процесс , вы имеете в виду, что на самом деле снова запустите программу? Или вы имеете в виду, что отвечаете «y» на запрос вопроса?

3. Вот и все, я отвечаю Y, а затем он снова вызывает функцию, хорошо? Таким образом, он «запускается заново» и работает нормально до цикла de while, когда я вызываю прерывание де второй клавиатуры, программа просто останавливается

4. Когда я вызываю второе отключение клавиатуры, он должен снова спросить меня, хочу ли я возобновить подсчет, но этого не происходит, просто останавливается

Ответ №1:

Это потому except , что блок обработки находится вне while True: цикла.

Когда вы нажимаете ctrl-C в первый раз и выбираете продолжить, start_chronometer выполняется рекурсивно во второй раз. Но когда рекурсивная функция завершается, исходное выполнение продолжается и достигает конца функции, потому что она больше не находится в цикле.

Измените свой код так, чтобы он while True охватывал все:

 while True:
    try:
        n  = 1
    except:
        ...
 

Также вам нужно будет добавить break инструкцию, когда пользователь решит остановиться, чтобы цикл завершился.

Комментарии:

1. Я понимаю ваше решение, я вижу, что оно также возможно, но оно все еще не работает… Та же проблема. Программа просто останавливается при втором прерывании

2. Я не понимаю, как это возможно. Можете ли вы обновить вопрос своим новым кодом?