Python计时器不会暂停,而是不断增加

问题描述 投票:0回答:1

我目前正在尝试制作一个计时器来跟踪Python程序。我尝试了很多不同的方法,但是当它们进入 while True 并通过函数调用时,它们都不起作用:计时器在被询问时不会暂停。

几个小时后我放弃了,发现一个 github 用户发布了他的代码来制作一个可以暂停的计时器。

这是我用于计时的修改后的代码:

from time import time

class Timer:
    def __init__(self):
        self.time_data = []
        self.is_started = False
        self.start_time = None

    def start(self):
        if self.is_started:
            return
        else:
            self.start_time = time()
            self.is_started = True
        
        return self

    def pause(self) -> None:
        elapsed = time() - self.start_time
        self.is_started = False

        self.time_data.append(elapsed)
        
    def resume(self):
        if self.is_started:
            print("Timer is already running")
            return

        self.start_time = (time() - sum(self.time_data)) + 1
        self.is_started = True    
        
    def elapsed(self):
        if self.is_started:
            current_elapsed = time() - self.start_time
            total_elapsed = sum(self.time_data) + current_elapsed
        else:
            total_elapsed = sum(self.time_data)
        return total_elapsed

然后我尝试在一个简单的程序上测试它:

from timing import Timer

timer = Timer()
timer.start()

sleep(1)

timer.pause()

sleep(2)

print(timer.elapsed()) #should print 1"
timer.resume()

sleep(3)

print(timer.elapsed()) #4"

timer.restart()
timer.pause()
print(timer.elapsed()) #0"

这个效果很好,但后来我尝试使用 While True 和函数:

from time import sleep
from timing import Timer

timer = Timer()

def start():
    timer.start()

def pause():
    timer.pause()

start()
while True:
    print(timer.elapsed())

    if timer.elapsed() >= 3:
        pause() 
        print("paused!")
    
    sleep(0.25) 

这就是它给我的:

2.2578864097595215
2.5090396404266357
2.7601206302642822
3.011416435241699
paused!
3.011416435241699
paused!
6.274340391159058
paused!

并且它继续下去,不断增加以非常快地达到非常高的值......

有人知道那里出了什么问题吗?

谢谢。

python time
1个回答
1
投票

看起来这个实现只是有问题。这似乎有效:

import time


class Timer:
    def __init__(self):
        self.start_time = None
        self.pause_time = None
        self.elapsed_time = 0

    def start(self):
        self.start_time = time.time()
        self.pause_time = None

    def pause(self):
        if self.pause_time is not None:
            raise ValueError("Timer is already paused")
        if self.start_time is None:
            raise ValueError("Timer is not running")
        self.pause_time = time.time()
        self.elapsed_time += self.pause_time - self.start_time
        self.start_time = None

    def resume(self):
        if self.pause_time is None:
            raise ValueError("Timer is not paused")
        self.start()

    def restart(self):
        self.start_time = time.time()
        self.elapsed_time = 0

    def elapsed(self):
        if self.start_time is not None:
            return time.time() - self.start_time + self.elapsed_time
        return self.elapsed_time


timer = Timer()
timer.start()
time.sleep(1)
timer.pause()
time.sleep(2)
print(timer.elapsed())  # should print 1"
timer.resume()
time.sleep(3)
print(timer.elapsed())  # 4"
timer.restart()
timer.pause()
print(timer.elapsed())  # 0"
© www.soinside.com 2019 - 2024. All rights reserved.