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

Dan*_*rew 2 python shell clock digital

我想在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)
Run Code Online (Sandbox Code Playgroud)

这会产生反复出现的打印,就像这样;

06/29/16 23:08:32

06/29/16 23:08:33

06/29/16 23:08:34
Run Code Online (Sandbox Code Playgroud)

我知道这很粗糙,我还在学习.我只想要在shell中使用"滴答"数字时钟的一行.我在空闲和Windows 10上使用python 3.5.1.

如果这是不可能的,我非常想知道原因.

非常感谢

slu*_*ion 10

如果您每次只打印出这样的固定长度输出,只要不打印换行符,就可以使用回车符回放到行的开头.例:

# 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"),
Run Code Online (Sandbox Code Playgroud)

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

# At the top...
import sys

# In the loop, after the first print
sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)

这一切都如下工作.想象一下,屏幕上实际上有一个光标.首先使用第一次打印(和刷新)打印出时间,然后将光标移回到行的开头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)
Run Code Online (Sandbox Code Playgroud)

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

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

print("hello", flush=True, end="")
Run Code Online (Sandbox Code Playgroud)

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

因此,正确的程序是:

import time

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