在 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 中运行一个基本的数字时钟的主要内容,如果未能解决你的问题,请参考以下文章