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