Таймер с перезапуском - PullRequest
       5

Таймер с перезапуском

1 голос
/ 08 февраля 2020

Я хочу создать простой таймер, в котором он отображает текущее оставшееся время (в моем коде я использую turtle, чтобы сделать его чище, но просто печатать на одну секунду меньше, чем каждую секунду, тоже будет работать нормально). Суть в том, что я хочу, чтобы, если я нажму клавишу на клавиатуре (это может быть указанная c клавиша, такая как ввод или пробел), я хочу, чтобы таймер перезапустился. Вот мой текущий код

time = input("Please enter the time").strip()
time = time.split(" ")
for i in range(len(time)):
    time[i]=int(time[i])
print(time)
seconds = 3600*time[0]+60*time[1]+time[2]
import turtle as turt
from time import sleep
t = turt.Turtle()
t.hideturtle()
for i in range(seconds, 0, -1):
    t.clear()
    t.write(i, align = 'center', font=("Arial", 40, "normal"))
    sleep(1)
t.clear()
t.write("TIMER DONE", align = 'center', font=("Arial", 40, "normal"))

Как мне сделать так, чтобы при нажатии клавиши на клавиатуре таймер перезагружался. Заранее благодарю за любую помощь!


РЕДАКТИРОВАТЬ: По сути, я хочу сделать так, чтобы при каждом нажатии клавиши на клавиатуре не имело значения, какая клавиша перезапускает программу независимо от того, на какой линии в данный момент находится программа.

Ответы [ 2 ]

1 голос
/ 08 февраля 2020

Я бы бросил время / сон и использовал бы собственную черепаху ontimer(), чтобы сделать обратный отсчет.

from turtle import Screen, Turtle

FONT = ("Arial", 40, "normal")

strings = input("Please enter the time: ").strip().split(' ')

time = [60 ** (len(strings) - index - 1) * int(unit) for index, unit in enumerate(strings)]

seconds = -1
ticking = False

def tick():
    global seconds, ticking

    turtle.clear()

    if seconds < 0:
        turtle.write("TIMER DONE", align='center', font=FONT)
        ticking = False
    else:
        turtle.write(seconds, align='center', font=FONT)
        seconds -= 1
        screen.ontimer(tick, 1000)

def reset():
    global seconds, ticking

    screen.onkey(None, "Return")  # Disable event handler inside handler

    seconds = sum(time)

    if not ticking:
        ticking = True
        tick()

    screen.onkey(reset, "Return")  # Reenable event handler

screen = Screen()

turtle = Turtle()
turtle.hideturtle()

reset()

screen.listen()
screen.mainloop()

Когда вы нажмете, он go вернется к исходному значению и начнет обратный отсчет снова. Даже после того, как таймер останавливается. Если вам просто нужно 15 секунд на часах, просто введите «15», вам не нужно вводить все поля.

1 голос
/ 08 февраля 2020

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

time = input("Please enter the time").strip()
        time = time.split(" ")
        for i in range(len(time)):
            time[i] = int(time[i])
        print(time)
        seconds = 3600 * time[0] + 60 * time[1] + time[2]
        print(seconds)
        import turtle as turt
        from time import sleep
        wn = turt.Screen()
        t = turt.Turtle()
        turt.listen()

        def reset(seconds):
            t.hideturtle()
            turt.listen()
            turt.onkey(up, "space")
            for i in range(seconds, 0, -1):
                t.clear()
                t.write(i, align='center', font=("Arial", 40, "normal"))
                sleep(1)
            t.clear()
            t.write("TIMER DONE", align='center', font=("Arial", 40, "normal"))


        def up():
            t.clear()
            seconds = 3600 * time[0] + 60 * time[1] + time[2]
            reset(seconds)

        reset(seconds)
        turt.done()


...