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

时间:2016-05-29 22:31:27

标签: 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)

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

06/29/16 23:08:32

06/29/16 23:08:33

06/29/16 23:08:34

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

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

最感谢

6 个答案:

答案 0 :(得分: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"),

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

# 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 datetime,strftime
    now = datetime.now()
    print (strftime("%m/%d/%Y %H:%M:%S"), end="", flush=True)
    print("\r", end="", flush=True)
    time.sleep(1)

答案 1 :(得分:1)

在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)

答案 2 :(得分:0)

您只需要:

public class PersonneRepositoryTest {

    @Mock
    private SessionFactory sessionFactory;

    @InjectMocks
    private PersonneRepositoryImpl personneRepositoryImpl;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testFindPersonne(){
        Personne p = new Personne();
        p.setId(1);
        when(personneRepositoryImpl.findByLoginInformations("ayoub", "aaaa")).thenReturn(p);
        assertEquals(p, personneRepositoryImpl.findById(1));
        verify(personneRepositoryImpl).findById(1);
    }
}

答案 3 :(得分:0)

以下代码对我有用。

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")

答案 4 :(得分:0)

您可以设置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('')

答案 5 :(得分:0)

对上述答案略有改进(删除了结尾的逗号;将结尾从“”更改为“ \ 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)