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 被覆盖)。