2016-05-29 5 views
2

Я хочу закодировать простые цифровые часы в оболочке python. Я хочу избежать использования tkinter, если это возможно. Это то, что я сейчас имею;запустить базовые цифровые часы в оболочке python

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 на простоях и окнах 10.

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

Kindest благодаря

+0

Возможный дубликат [Заменить консольный вывод в питоне] (http://stackoverflow.com/questions/6169217/replace-console-output-in-python) –

+0

Я не думаю, что вам будет очень повезло с этим на праздном, я бы порекомендовал вам полностью забыть про простой и использовать ipython или один из многих хороших пионеров python, например pycharm и т. Д. –

ответ

9

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

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

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

EDIT: Как @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

Вы можете установить 'flush = True 'в функции печати, но я не думаю, что все, что вы делаете, будет работать в режиме ожидания. –

+0

@PadraicCunningham: спасибо, я не понимал, что это вариант. Я не уверен в себе и сам, и, к сожалению, у него нет лжи, чтобы проверить. Однако он работает в Python REPL. – slugonamission

+0

@PadraicCunningham - только что осознанный OS X действительно поставляется с IDLE.Это, к сожалению, не работает, и данный [этот ответ] (http://stackoverflow.com/questions/19187759/implementing-a-backspace-in-python-3-3-2-shell-using-idle), I не думайте, что есть способ заставить его работать. Тем не менее, для OP этот метод работает, если вы работаете в командной строке. – slugonamission

 Смежные вопросы

  • Нет связанных вопросов^_^