在 python shell 中运行一个基本的数字时钟

新手上路,请多包涵

我想在 python shell 中编写简单的数字时钟。如果可能,我想避免使用 tkinter。这就是我目前拥有的;

 import time
while True:
    from datetime import datetime
    now = datetime.now()
    print ("%s/%s/%s %s:%s:%s" % (now.month,now.day,now.year,now.hour,now.minute,now.second))
    time.sleep(1)

这会产生一个重复的打印输出,像这样;

 06/29/16 23:08:32

06/29/16 23:08:33

06/29/16 23:08:34

我知道这很粗糙,我还在学习。我只想要一条线,外壳中有一个“滴答作响”的数字时钟。我在闲置和 Windows 10 上使用 python 3.5.1。

如果这不可能,我非常想知道为什么。

衷心感谢

原文由 DanMcGrew 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 303
1 个回答

如果你只是每次都像这样打印出一个固定长度的输出,你可以使用回车符返回到行的开头,只要你不打印换行符。例子:

 # Note trailing comma, that suppresses the newline in Python
print ("%s/%s/%s %s:%s:%s" % (now.month,now.day,now.year,now.hour,now.minute,now.second)),

# Now rewind back to the start of the line. Again, not trailing comma
print("\r"),

现在,您可能还会注意到屏幕上没有打印任何内容。这是因为标准输出是缓冲的,所以你可以用这个刷新:

 # At the top...
import sys

# In the loop, after the first print
sys.stdout.flush()

这一切的工作方式如下。想象一下屏幕上实际上有一个光标。您首先使用第一次打印(和刷新)打印出时间,然后使用 print("\r"), 将光标移回行首。这实际上并没有删除任何字符,它只是移动了光标。然后你下次再写出来。因为恰好恰好是完全相同的长度,所以时间被再次写出,替换了旧字符。

生成的脚本如下所示:

 import time
import sys

while True:
    from datetime import datetime
    now = datetime.now()
    print ("%s/%s/%s %s:%s:%s" % (now.month,now.day,now.year,now.hour,now.minute,now.second)),
    sys.stdout.flush()
    print("\r"),
    time.sleep(1)

如果你想对正在发生的事情进行更细粒度的控制,你可以开始使用 curses 库,但我认为这对于你在这里尝试做的事情来说有点过分了。

编辑:正如@PadraicCunningham 在评论中提到的,在 Python 3 中禁止换行打印并强制内容刷新到屏幕的正确语法如下:

 print("hello", flush=True, end="")

另外,正如@AlexHall 所提到的,print 语句实际上并不打印固定宽度的语句;所以要做到这一点,我们应该使用 strftime() 代替。

因此正确的程序是:

 import time

while True:
    from datetime import strftime
    print (strftime("%m/%d/%Y %H:%M:%S"), end="", flush=True)
    print("\r", end="", flush=True)
    time.sleep(1)

原文由 slugonamission 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题