Python Curses Обновление текста с помощью цикла - PullRequest
0 голосов
/ 28 января 2019

Я подключаюсь через терминал Linux Mint Xfce ssh (также пробовал ssh -t) к Raspberry Pi с Rasperian Stretch.На Pi у меня есть пример Python-Curses, который я модифицировал, пытаясь заставить текущее время обновляться каждые несколько секунд «на месте» поверх самой записи.Но он печатает время один раз, а затем никогда не печатает обновленное время.Но если я вручную нажимаю клавишу «Ввод» на моем ноутбуке, время обновляется, если я нажимаю «Ввод» быстро несколько раз, «вводит» стек, и время показывает обновления столько раз, сколько я нажимал «Ввод».В этом случае, возможно, есть что-то базовое, чего я не понимаю, о Curses и терминалах или Python.Ценить это.Вот код:

import curses
import traceback
import datetime
import time

try:
    # -- Initialize --
    stdscr = curses.initscr()   # initialize curses screen
    curses.noecho()             # turn off auto echoing of keypress on to screen
    curses.cbreak()             # enter break mode where pressing Enter key
                                #  after keystroke is not required for it to register
    stdscr.keypad(1)            # enable special Key values such as curses.KEY_LEFT etc

    # -- Perform an action with Screen --
    stdscr.border(0)
    stdscr.addstr(5, 5, 'Hello from Curses!', curses.A_BOLD)
    stdscr.addstr(6, 5, 'Press q to close this screen', curses.A_NORMAL)

    while True:
        # stay in this loop till the user presses 'q'
        #stdscr.addstr(7, 5, 'zztop',curses.A_NORMAL)
        ti = str((datetime.datetime.now().time()))
        stdscr.addstr(8, 5, 'Time: '+ ti, curses.A_NORMAL)
        time.sleep(3)

        ch = stdscr.getch()
        if ch == ord('q'):
            break



    # -- End of user code --

except:
    traceback.print_exc()     # print trace back log of the error

finally:
    # --- Cleanup on exit ---
    stdscr.keypad(0)
    curses.echo()
    curses.nocbreak()
    curses.endwin()

1 Ответ

0 голосов
/ 29 января 2019

Вам нужно вызвать stdscr.refresh() перед сном, чтобы сбросить вывод на экран.

Вы также можете добавить stdscr.nodelay(1) к последовательности инициализации в вашей программе (т. Е. Прямо под stdscr.keypad(1)),Это сделает звонки на stdscr.getch() неблокирующими.Кроме того, вы можете вместо этого позвонить на stdscr.timeout(3000) и полностью удалить вызов на sleep.

...