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

Posted

技术标签:

【中文标题】在 python shell 中运行一个基本的数字时钟【英文标题】:run a basic digital clock in the python shell 【发布时间】:2016-09-27 16:31:42 【问题描述】:

我想在 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。

如果这不可能,我非常想知道原因。

非常感谢

【问题讨论】:

Replace console output in python的可能重复 我认为你在空闲时不会有太多运气,我建议你完全忘记空闲并使用 ipython 或许多好的 python IDE 之一,如 pycharm 等。 【参考方案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 在 cmets 中提到的,在 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)

【讨论】:

您可以在打印功能中设置flush=True,但我认为您所做的任何事情都不会在空闲时工作 @PadraicCunningham:谢谢,我没有意识到这是一个选择。我自己也不确定 IDLE,遗憾的是没有让它到处测试。它确实在 Python REPL 中工作。 不用担心,OP 使用的是 python3.5,所以您还可以设置 end="" 以从内存中删除换行符,我认为这在空闲时不起作用,我认为安装 idlex 可能会奏效idlex.sourceforge.net 哎呀,我还是习惯了 Python 2。不过更新了,干杯 :) @AlexHall,哎呀,删除了.flush()。至于要求flush=True,这完全取决于您的平台。 Linux 和 OS X 的 libc 通常缓冲输出,并且只在换行符上刷新到屏幕;我不能 100% 确定 Windows 的行为。【参考方案2】:

你只需要:

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

【讨论】:

【参考方案3】:

在 repl.it 中尝试过,这对我有用...(添加了逗号和 now.strftime)

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

【讨论】:

【参考方案4】:

以下代码对我有用。

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

【讨论】:

【参考方案5】:

您可以设置end= " " 删除换行符并添加回车,即:

'\r'

因此,应该为您工作的正确程序是:

from datetime import datetime
import time    

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

【讨论】:

【参考方案6】:

对上述答案略有改进(删除尾随逗号;并将 end 从 "" 更改为 "\r" 以将回车作为单个打印语句的一部分。

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

【讨论】:

【参考方案7】:

ImportError: cannot import name 'strftime' from 'datetime' (/usr/lib/python3.7/datetime.py) 所以,使用下面的代码:

import time, sys

while True:
    from datetime import datetime
    now = datetime.now()
    showClock =" %s:%s:%s" % (now.hour,now.minute,now.second)
    print(showClock, end="\r")

【讨论】:

以上是关于在 python shell 中运行一个基本的数字时钟的主要内容,如果未能解决你的问题,请参考以下文章

shell 基本语法介绍

Shell 编程基础

Python全栈之路Day9

在 impala-shell 中运行 Python 脚本

使用python在服务器上的同一个shell中运行多个命令[重复]

需要从 Python 脚本运行 shell 命令并存储在变量中 [重复]