Python 如果没有首先刷新 stdscr,则不会显示 curses 的 newwin
Python curses' newwin not being displayed if stdscr hasn't been refreshed first
我目前正在玩弄诅咒并试图了解一切的反应。我以为我正在取得进步,直到我偶然发现了这段简单的代码:
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()
的副作用,在为刷新完成的重绘中立即被覆盖。手册页说 getch
这样做:
If the window is not a pad, and it has been moved or modified since the
last call to wrefresh
, wrefresh
will be called before another character
is read.
初始化 curses 使 stdscr
在第一次绘制时被清除。同样,在手册页中(initscr
):
initscr
also causes the first call to refresh
(3x)
to clear the screen.
我使用实用程序 (unmap
) 生成了此列表,它使所有内容都可读(实际上 空格 未转换),使用 script
将输出输出到终端(并将显示限制为 5x5 屏幕):
Script started on 2021-04-09 19:08:24-04:00 [TERM="screen.xterm-new" TTY="/dev/pts/0" COLUMNS="80" LINES="40"]
\n
\E[?1049h
\E[22;0;0t
\E[1;5r
\E(B
\E[m
\E[4l
\E[?7h
\E[?1h
\E=
\E[39;49m
\E[39;49m
\E[37m
\E[40m
\E[1;1H
\E[2;1H
\E[3;1H
\E[4;1H
\E[5;1H
\E[?7l
\E[?7h
\E[H
\E[2dB
\E[39;49m
\E[37m
\E[40m
\E[H
\E[2;1H
\E[3;1H
\E[4;1H
\E[5;1H
\E[?7l
\E[?7h
\E[HA
\E[?1l
\E>
\E[39;49m\r
\E[5d
\E[K
\E[5;1H
\E[?1049l
\E[23;0;0t\r
\E[?1l
\E>
\nScript done on 2021-04-09 19:08:24-04:00 [COMMAND_EXIT_CODE="0"]
\n
“B”出现在这一行:
\E[2dB
以及上面的“A”:
\E[HA
(其他字符是转义序列的一部分)。
取消注释该行完成 initscr
所需的重新绘制,stdscr
没有剩余工作stdscr.getch()
调用中需要(因此新 window 的 none 被覆盖)。
我目前正在玩弄诅咒并试图了解一切的反应。我以为我正在取得进步,直到我偶然发现了这段简单的代码:
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()
的副作用,在为刷新完成的重绘中立即被覆盖。手册页说 getch
这样做:
If the window is not a pad, and it has been moved or modified since the last call to
wrefresh
,wrefresh
will be called before another character is read.
初始化 curses 使 stdscr
在第一次绘制时被清除。同样,在手册页中(initscr
):
initscr
also causes the first call torefresh
(3x) to clear the screen.
我使用实用程序 (unmap
) 生成了此列表,它使所有内容都可读(实际上 空格 未转换),使用 script
将输出输出到终端(并将显示限制为 5x5 屏幕):
Script started on 2021-04-09 19:08:24-04:00 [TERM="screen.xterm-new" TTY="/dev/pts/0" COLUMNS="80" LINES="40"]
\n
\E[?1049h
\E[22;0;0t
\E[1;5r
\E(B
\E[m
\E[4l
\E[?7h
\E[?1h
\E=
\E[39;49m
\E[39;49m
\E[37m
\E[40m
\E[1;1H
\E[2;1H
\E[3;1H
\E[4;1H
\E[5;1H
\E[?7l
\E[?7h
\E[H
\E[2dB
\E[39;49m
\E[37m
\E[40m
\E[H
\E[2;1H
\E[3;1H
\E[4;1H
\E[5;1H
\E[?7l
\E[?7h
\E[HA
\E[?1l
\E>
\E[39;49m\r
\E[5d
\E[K
\E[5;1H
\E[?1049l
\E[23;0;0t\r
\E[?1l
\E>
\nScript done on 2021-04-09 19:08:24-04:00 [COMMAND_EXIT_CODE="0"]
\n
“B”出现在这一行:
\E[2dB
以及上面的“A”:
\E[HA
(其他字符是转义序列的一部分)。
取消注释该行完成 initscr
所需的重新绘制,stdscr
没有剩余工作stdscr.getch()
调用中需要(因此新 window 的 none 被覆盖)。