Как очищать консоль?
Пытался реализовать секундомер в консоли, но не нашел способа, как очищать консоль, при новой выдаче. Суть в том, что нужно чтобы значения обновлялись, а не выводились каждый раз на новую строку. Сам код:
import time, os
seconds,minutes,hours = 0,0,0
while True:
time.sleep(1)
if seconds == 60:
seconds = 0
minutes+=1
if minutes == 60:
minutes = 0
hours+=1
if hours > 0:
print(f"{'hours'} : {hours:02} {'minutes'} : {minutes:02} {'seconds'} : {seconds:02}")
elif minutes > 0:
print(f"{'minutes'} : {minutes:02} {'seconds'} : {seconds:02}")
else:
print(f"{'seconds'} : {seconds:02}",sep='',end='\r')
os.system('cls||clear')
seconds+=1
Пишу на Windows, VSCode.
Ответы (3 шт):
Попробуйте сделать так:
print(f"\r{'hours'} : {hours:02} {'minutes'} : {minutes:02} {'seconds'} : {seconds:02}", end="")
Ну и для всех остальных, соответственно. То есть, \r возвращает каретку в начало строки, а end="" не переносит ввод на следующую, то есть, если в обычном print обычно конец вывода сообщения заканчивается \n, то в этом случае переноса не будет.
Ну и в этом случае очищать вывод не нужно, то есть os.system('cls||clear') можно убрать.
Вот результат работы. Как видите, уже досчитало до 8 без переносов.
Фантазия на тему:
import time
start = time.monotonic()
while True:
current = (loop_start := time.monotonic()) - start
min_total, seconds = divmod(current, 60)
hours, minutes = divmod(min_total, 60)
time_pattern = (
('hours {:02}', int(hours), ()),
('minutes {:02}', int(minutes), (hours,)),
('seconds {:02}', int(seconds), (minutes, hours)),
)
time_string = ' '.join(
map(lambda x: x[0].format(x[1]), filter(lambda x: x[1] or any(x[2]), time_pattern))
)
print(
time_string, end='\r'
)
delay = 1 - (time.monotonic() - loop_start) % 1
time.sleep(
delay
)

