Проблемы с программой обратного отсчета Python

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

Приведенный ниже код представляет собой программу для программы обратного отсчета Python. Что делает программа, так это то, что она просит пользователя ввести количество секунд, минут и часов.

В любом случае, я заметил 2 ошибки, которые возникают в программе.

Первая ошибка: если мы вводим счетчик часов и секунд (но не минут), программа будет считать оставшееся время для этого определенного часа, но не будет вычитать час и устанавливать минуты обратно на 59. Вместо этого он будет печатать минуты как отрицательное число.

Вторая ошибка: если мы введем счетчик часов, секунд и минут, программа будет считать оставшееся время. Но когда программа достигает самой последней минуты (т. е. 01:00:59), она пропускает эту минуту и ​​переходит к следующей (т. е. 00:59:59).

О второй ошибке: допустим, я ввожу 1 час, 1 минуту, 5 секунд. Он будет отсчитывать 5 секунд. Затем компьютер печатал 1:00:00. Вместо того, чтобы отсчитывать секунды для этой определенной минуты. Он будет пропущен до 0:59:59. Надеюсь, это поможет. Было бы здорово, если бы я мог получить помощь в исправлении этих двух ошибок и, возможно, способ по-другому отформатировать программу.

Спасибо за прочтение, и я с нетерпением жду вашего ответа, - Аноним.

import time
time_count = 0
    second = int(raw_input("Seconds:"))
    count_minute = int(raw_input("Minutes:"))
count_hour = int(raw_input("Hours:"))

    time_count += second
time_count += count_minute * 60
time_count += count_hour * 3600

    def clean():    
    global second
    global count_minute
    global count_hour
    print_second = str(second).zfill(2)
    print_minute = str(count_minute).zfill(2)
    print_hour = str(count_hour).zfill(2)
    print "%s:%s:%s" % (print_hour, print_minute, print_second)
time.sleep(1)
clean()
time.sleep(1)
for i in range(1, time_count + 1)[::-1]:
    if second == 0 and count_minute == 0 and count_hour == 0:
        clean()
        break 
    elif second != 0:
        second -= 1
    elif second == 0:
        count_minute -= 1
        second = 59
        if count_minute == 0 and count_hour > 0:
            clean()
            count_hour -= 1
            count_minute = 59
    clean()
    time.sleep(1)
print """
Timer Finished.
"""

person JKodner    schedule 25.07.2013    source источник
comment
Не могли бы вы удалить ненужный код (например, форматирование и вывод визуальных строк), чтобы помощники SO могли больше сосредоточиться на вашей реальной проблеме/вопросе?   -  person woozyking    schedule 25.07.2013
comment
Так ты имеешь в виду, что Jacob Kodner это просто твой псевдоним, Анонимус? Действительно подлый!   -  person Henrik Andersson    schedule 25.07.2013
comment
Когда дело доходит до форматирования вашей программы, вы, вероятно, должны задать вопрос здесь: codereview.stackexchange.com   -  person Wayne Werner    schedule 25.07.2013
comment
пожалуйста, объясните вторую ошибку лучше, я думаю, что вы, возможно, опечатались   -  person Stephan    schedule 25.07.2013
comment
О второй ошибке: допустим, я ввожу 1 час, 1 минуту, 5 секунд. Он будет отсчитывать 5 секунд. Затем компьютер печатал 1:00:00. Вместо того, чтобы отсчитывать секунды для этой определенной минуты. Он будет пропущен до 0:59:59. Надеюсь, это поможет. Было бы здорово, если бы я мог получить помощь в исправлении этих двух ошибок и, возможно, способ по-другому отформатировать программу.   -  person JKodner    schedule 25.07.2013
comment
@JacobKodner, ты пробовал мой ответ?   -  person elyase    schedule 25.07.2013
comment
Я немного запутался в синтаксисе, сейчас читаю модуль.   -  person JKodner    schedule 26.07.2013


Ответы (1)


Некоторые проблемы в вашем коде: ненужное использование globals, прямая проверка типов и т. д. Также, если вы используете конструкции более высокого уровня (например, объекты timedelta), вероятность вашего код без ошибок выше. Это лучше:

from datetime import timedelta
from time import sleep

while True:
    try:
        hours, minutes, seconds = input('Enter hours, minutes, seconds (with a comma in between): ')
    except (ValueError, TypeError):    # other errors
        print("Error 1, please ...")
        continue
    except NameError:
        print("Error 2")
        continue
    else:
        print("All good")
        break

total = timedelta(hours=hours, minutes=minutes, seconds=seconds)
for passed_seconds in range(int(total.total_seconds())):
    print total - timedelta(seconds=passed_seconds)
    sleep(1)
person elyase    schedule 25.07.2013
comment
Большое вам спасибо за вашу помощь! - person JKodner; 26.07.2013