Search code examples
pythontimetimer

timer starting at the beginning of the program instead of starting point


hey i've been working on a timer using python time class. the time should start after the user presses F7 but for some reason it starts counting as soon as I run the program.

from pynput import keyboard
from time import perf_counter
from time_sig import signature


print("Welcome to your smart timer")
datafile = open('data', 'a')
ex_name = input("Please type in the exercise type: ")
datafile.write("\nStarted exercise: " + ex_name.upper())

print("Click F7 to start, F8 every time you finished a question and F9 to stop")

count = 0


def execute_F7():
    print("starting timer")
    t = perf_counter()
def execute_F8():
    print("finished question")
    tic = perf_counter
    transfer = signature(tic)
    global count
    count += 1
    datafile.write("\nfinished question number " + str(count) + " on time: " + str(signature.convert(transfer)) + " in (" + str(signature.q_time(transfer)) + ")")
    print(str(signature.convert(transfer)))

def execute_F4():
    tic = perf_counter
    transfer = signature(tic)
    print(str(signature.convert(transfer)))
    datafile.write("\nfinished question number " + str(count) + " on time: " + str(signature.convert(transfer)) + " in (" + str(signature.q_time(transfer)) + ")")
    datafile.write("\nWorkout done!")
    print("Workout done!")
    exit()


def on_press(key):
    if key == keyboard.Key.f7:
        execute_F7()
    elif key == keyboard.Key.f8:
        execute_F8()
    elif key == keyboard.Key.f4:
        execute_F4()


with keyboard.Listener(on_press=on_press) as listener:
    listener.join()

love any help thanks!


Solution

  • The perf_counter is always running in the background; its absolute value is undefined, but based on what you're seeing I expect it starts at 0. To time a particular event, you need to subtract perf_counter() from an earlier reference value. Something like:

    from time import perf_counter
    from typing import Optional
    
    
    class Stopwatch:
        """Measures elapsed time in seconds."""
        def __init__(self):
            self._start: Optional[float] = None
    
        def start(self) -> None:
            """Starts the stopwatch."""
            self._start = perf_counter()
    
        def stop(self) -> float:
            """Stops the stopwatch, returning the elapsed time."""
            assert self._start is not None, "Missing call to start()"
            elapsed = perf_counter() - self._start
            self._start = None
            return elapsed