sleep(1) 指示程序“休眠”1 秒钟。这实际上非常重要,因为这意味着 while 循环(始终为真)将每秒只运行一次。当您取消 sleep(1) 行时,这意味着 while 循环永远不会中断并继续以计算机可以无限运行的速度运行。您可能会尝试的一件事是将 sleep(1) 降低到某个较小的值。例如,您可以指定 sleep(0.1)
通过减少它的睡眠时间,这意味着时钟将更频繁地更新。现在使用 sleep(1) 时钟每秒更新一次,这很有意义。但是,您可以通过使用 sleep(0.1) 使时钟每秒更新 10 次来提高准确性。让我知道这一切是否有意义。
闪烁可能是由于程序每秒多次清除和重新填充显示造成的。
编辑:文档建议将十进制值发送到 sleep() 函数是有效的
编辑 2:关于如何仅在一秒钟之内刷新显示的额外信息
from datetime import datetime
from time import sleep, mktime
dti = mktime(datetime.now().timetuple())
while 1:
ndti = mktime(datetime.now().timetuple())
if dti < ndti:
dti = ndti
lcd.clear()
lcd.message(datetime.now().strftime('%b %d %H:%M:%S\n'))
sleep(0.95)
else:
sleep(0.01)
本质上,它是这样工作的:
启动程序时,创建一个整数形式的日期时间(我们的 var dti
)。通过“整数形式”,我的意思是将某个任意开始日期(例如1970-01-01 00:00:00
)的所有秒数相加,并将其用作时间的参考。例如,今天 (2016-08-18 00:00:00) 可能是自 1970 年以来的 1471478400 秒。一旦我们有了这个值,我们就开始我们的循环。
在循环开始时,我们总是创建一个新的日期时间整数 ( ndti
) 来跟踪自上次运行循环以来我们所处的位置。有了这些方便的信息,我们就进入了if
条件句。if
与我们的旧日期时间整数 () 相比,我们的新日期时间整数 ( ndti
) 完全改变了一秒,dti
那么这显然意味着一秒过去了。既然是这样,我们现在将我们的参考日期时间整数设置为现在的日期时间(dti = ndti
)。然后我们显示我们的消息(lcd.clear()
和lcd.message()
)。之后,我们将让程序休眠不到 1 秒 ( sleep(0.95)
)。由于某些计算机的睡眠时间可能超过了确切的分配时间,因此这给了我们 0.05 秒的不准确缓冲时间。如果我们正在运行if
有条件的并且一秒钟还没有过去,我们将让程序休眠一小段时间并继续重复,直到一秒钟实际过去(sleep(0.01)
)。
如果一切都按计划进行,那么我们的程序应该每秒只刷新一次液晶屏幕,并且它还应该在那一秒的大约 95% 的时间里处于休眠状态,这样我们就不会无缘无故地转动轮子时间。另一个需要注意的部分是,由于我们的else
子句告诉程序休眠 0.01 秒,这意味着在大多数情况下,我们的时钟只能有 0.01 秒的误差,这非常好。这足够低,几乎无法被人类检测到。让我知道这一切是否有意义。
我通过命令行对此进行了测试(用简单的打印语句替换了 lcd 的东西),它似乎与另一个时间跟踪资源完全一致(http://time.is/)
试试看它是否适合你。