Python诅咒';如果stdscr没有';我没有先刷新
我现在正在玩诅咒游戏,试图了解一切的反应。我一直以为自己在进步,直到我偶然发现了这段简单的代码:Python诅咒';如果stdscr没有';我没有先刷新,python,ncurses,curses,python-curses,Python,Ncurses,Curses,Python Curses,我现在正在玩诅咒游戏,试图了解一切的反应。我一直以为自己在进步,直到我偶然发现了这段简单的代码: import curses def main(stdscr: curses.window) -> None: stdscr.addstr(0, 0, "A") # stdscr.refresh() win = curses.newwin(2, 2, 1, 0) win.addstr(0, 0, "B") win
import curses
def main(stdscr: curses.window) -> None:
stdscr.addstr(0, 0, "A")
# stdscr.refresh()
win = curses.newwin(2, 2, 1, 0)
win.addstr(0, 0, "B")
win.refresh()
stdscr.getch()
curses.wrapper(main)
这里我不明白的是,为什么结果是一个只有a而没有B的屏幕。我还发现有趣的是,如果我取消注释注释行,我会得到a和B
有人能解释一下发生了什么,或者至少给我指一些解释它的文件
提前谢谢 实际上,“B”被写入终端,但在刷新时,由于stdscr.getch()的副作用,在重新绘制时立即被覆盖。手册页面上说:
如果窗口不是焊盘,并且自
最后一次调用wrefresh
,wrefresh
将在另一个字符之前调用
是读的
初始化诅咒会在第一次绘制时清除stdscr
。同样,在手册页中(对于):
initscr
也会导致第一次调用
清除屏幕
我使用一个实用程序()生成了这个列表,该实用程序使所有内容都可读(实际上,空格不会转换),使用脚本
将输出带到终端(并将显示限制为5x5屏幕):
“B”出现在这一行:
\E[2dB
以及这方面的“A”:
(其他字符是转义序列的一部分)
取消对该行的注释将完成initscr所需的重新绘制,并且在调用stdscr.getch()中不再需要stdscr
(因此没有任何新窗口被覆盖)。这太神奇了!非常感谢您非常详细的回答!感谢您向我介绍ncurses的手册,它比python的curses文档要详细得多,我相信它在将来会对我有很大的帮助。我正在为python的curses编写一个包装器,以提供更多的小部件(表、菜单等等),我现在正在考虑添加stdscr.refresh()
在initscr
的末尾,以避免这种“副作用”。我猜这不是为了性能问题和防止屏幕闪烁而在ncurses中做的,但我认为现在这不应该是一个问题。你知道这样做的其他原因吗?您是否认为在初始化中添加刷新可能是个坏主意?
\E[2dB
\E[HA