首页 > 解决方案 > 程序未运行时也要继续倒计时

问题描述

我最近打开了另一个关于不同事物的Q,现在我想在程序不运行的时候继续倒计时,我想我知道该怎么做,也许计算剩余时间然后用当前减去它时间,但我不确定,所以这就是我在这里问的原因。

有没有办法在程序未运行时也计算时间,例如,我从 60 开始倒计时,关闭程序,然后当我打开它时,我会看到 45 秒(15 秒)。

我想将时间写入文件,然后从中读取。

当前计划

import os
from time import sleep

class CountDown:
    def __init__(self):
        if not os.path.exists('last_time.txt'):
            with open('last_time.txt', 'w') as f:
                pass
        self.write_time()

    def countdown(self, time=60) -> None:
        while time > 0:
            print(time)
            sleep(1)
            time -= 1
            f = open("last_time.txt", 'w')
            f.write(str(time))
            f.close()

    def write_time(self) -> None:
        with open('last_time.txt', 'r') as f:
            if not os.stat('last_time.txt').st_size == 0: # Check if file is empty
                self.countdown(int(f.read()))
            else:
                self.countdown()

if __name__ == '__main__':
    CountDown()

标签: python

解决方案


这应该有效:

import time, os

endtime = 0
def setup(n=60):
    global endtime
    if os.path.isfile("time.txt"):
        with open("time.txt") as f:
            endtime = float(f.read())

        if time.time() > endtime:
            delfile()
        else:
            return
    with open("time.txt","w") as f:
        endtime = time.time()+n
        f.write(str(endtime))

def delfile():
    os.remove("time.txt")

print("Starting timer... ", end="")
setup()
print("Done!")

while True:
    print("Time remaining:", round(endtime-time.time()))
    time.sleep(1)
    if time.time() > endtime:
        break

delfile()

示例会话:

Starting timer... Done!
Time remaining: 60
Time remaining: 59
Time remaining: 58
Time remaining: 57
Time remaining: 56
Traceback (most recent call last):
  File "...", line 27, in <module>
    time.sleep(1)
KeyboardInterrupt

--- RESTART ---

Starting timer... Done!
Time remaining: 45
Time remaining: 44
Time remaining: 43
Time remaining: 42
Time remaining: 40
Time remaining: 39

...

如果你想使用一个类,使用这个:

import os, time

class CountDown:
    def __init__(self, n=60):
        self.endtime = 0
        self.setup(n)

    def setup(self, n):
        if os.path.isfile("end_time.txt"):
            with open("end_time.txt") as f:
                self.endtime = float(f.read())

            if time.time() > self.endtime:
                self.delfile()
            else:
                return
        with open("end_time.txt","w") as f:
            self.endtime = time.time()+n
            f.write(str(self.endtime))

    def countdown(self) -> None:
        while True:
            print("Time remaining:", round(self.endtime-time.time()))
            time.sleep(1)
            if time.time() > self.endtime:
                break
        self.delfile()

    def delfile(self):
        os.remove("time.txt")

if __name__ == '__main__':
    c = CountDown(60)
    c.countdown()

解释:

当您创建此类的实例时,它会尝试加载文件。该文件将包含计时器何时结束的时间戳。如果该文件不存在,或者该时间戳已经过去,它会将一个新的时间戳(未来一分钟)写入该文件。它将结束时间存储为一个属性。当您调用 时countdown(),它会打印当前时间和结束时间之间的时间差,直到结束时间过去,此时它会删除文件。


推荐阅读