我想在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。
如果这不可能,我非常想知道原因。
最感谢
答案 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)