Запустить основные цифровые часы в оболочке Python

Я хочу кодировать простые цифровые часы в оболочке Python. Я хочу по возможности избегать использования 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

Я знаю, что это грубо, я все еще учусь. Я просто хочу одну строку с "тикающими" цифровыми часами в корпусе. Я использую Python 3.5.1 на холостом ходу и Windows 10.

Если это невозможно, я бы очень хотел узнать почему.

Самое доброе спасибо

7 ответов

Если вы просто печатаете вывод фиксированной длины, подобный этому, каждый раз, вы можете использовать символ возврата каретки для перемотки назад к началу строки, если вы не печатаете новую строку. Пример:

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

Все, что тебе нужно:

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)

Попробовал это в 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)

Небольшое улучшение приведенных выше ответов (удаление конечной запятой и изменение конца с "" на "\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)

Вы могли бы установить 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('')

Следующий код работает для меня.

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

ImportError: невозможно импортировать имя «strftime» из «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")
Другие вопросы по тегам