python - 程序未运行时也要继续倒计时
问题描述
我最近打开了另一个关于不同事物的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()
解决方案
这应该有效:
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()
,它会打印当前时间和结束时间之间的时间差,直到结束时间过去,此时它会删除文件。
推荐阅读
- python - Pytorch/numpy/python 高效插值损坏数据
- bash - 使用 jq 将 JSON 响应转换为键值对
- java - 杰克逊:反序列化时允许嵌套或“平面”收集
- gatsby - Gatsby + contentful + Netlify 的私人/登录部分
- javascript - JavaScript 中的数组(用于插入和删除)是否有任何替代方法来优化性能
- javascript - 需要抢回 3 个级别的 URL
- laravel - 如何按年和月对记录进行分组?拉拉维尔
- stata - 在与变量匹配的字符串中提取术语
- beyondcompare4 - 如何在 Beyond Compare 4 中忽略大小写
- javascript - 如何使用 defaultProps 为 React 函数组件定义接口而不抛出缺少类型错误?