Python 诅咒循环刷新文本
Python Curses Refreshing Text With a Loop
我正在通过 Linux Mint 的 Xfce 终端 ssh(也尝试过 ssh -t)连接到 Raspberry Pi 运行 Rasperian Stretch。在 Pi 上,我有一个 Python-Curses 示例,我对其进行了修改,试图让当前时间每隔几秒更新一次 "in place" 来覆盖自身。但它最初打印时间一次,然后从不打印更新时间。但是,如果我在笔记本电脑上手动按下 "Enter" 键,时间会更新,如果我快速按下 "Enter" 多次 "enters" 叠加,时间显示更新的次数与我按下的次数一样多进入。在这种情况下,可能有一些我不了解 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()
您需要在睡觉前调用 stdscr.refresh()
以将输出刷新到屏幕。
您可能还想将 stdscr.nodelay(1)
添加到程序的初始化序列中(即,就在 stdscr.keypad(1)
下方)。这将使对 stdscr.getch()
的调用成为非阻塞的。或者,您可以改为调用 stdscr.timeout(3000)
并完全删除对 sleep
的调用。
我正在通过 Linux Mint 的 Xfce 终端 ssh(也尝试过 ssh -t)连接到 Raspberry Pi 运行 Rasperian Stretch。在 Pi 上,我有一个 Python-Curses 示例,我对其进行了修改,试图让当前时间每隔几秒更新一次 "in place" 来覆盖自身。但它最初打印时间一次,然后从不打印更新时间。但是,如果我在笔记本电脑上手动按下 "Enter" 键,时间会更新,如果我快速按下 "Enter" 多次 "enters" 叠加,时间显示更新的次数与我按下的次数一样多进入。在这种情况下,可能有一些我不了解 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()
您需要在睡觉前调用 stdscr.refresh()
以将输出刷新到屏幕。
您可能还想将 stdscr.nodelay(1)
添加到程序的初始化序列中(即,就在 stdscr.keypad(1)
下方)。这将使对 stdscr.getch()
的调用成为非阻塞的。或者,您可以改为调用 stdscr.timeout(3000)
并完全删除对 sleep
的调用。