Python ncurses:在第一次按键之前不显示屏幕,即使刷新是第一次

Dan*_*Dan 2 python ncurses python-curses

下面的代码可让您使用箭头键"."在屏幕上的小网格中走动.你在哪里探索过或者在旁边.即使我在第一次getch之前刷新(获得一个击键),屏幕也不会先显示任何内容,直到你离开你的起始位置.不应该立即显示addstr然后刷新然后getch等待吗?我甚至尝试添加一个stdscr.refresh(),但这也没有帮助.如何在等待第一个击键之前立即刷新屏幕?

import curses

def start(stdscr):
    curses.curs_set(0)
    movement = curses.newpad(10, 10)

    cur_x, cur_y = 5, 5

    while True:
        movement.addstr(cur_y, cur_x, '@')
        for (x_off, y_off) in [(-1,0),(1,0),(0,-1),(0,1)]:
            movement.addstr(cur_y + y_off, cur_x + x_off, '.')
        movement.refresh(1, 1, 0, 0, 7, 7) #Nothing is displayed until after the first key-stroke

        key_stroke = stdscr.getch()
        move_attempt = False
        if 0 < key_stroke < 256:
            key_stroke = chr(key_stroke)
        elif key_stroke == curses.KEY_UP and cur_y > 1:
            cur_y -= 1
        elif key_stroke == curses.KEY_DOWN and cur_y < 8:
            cur_y += 1
        elif key_stroke == curses.KEY_LEFT and cur_x > 1:
            cur_x -= 1
        elif key_stroke == curses.KEY_RIGHT and cur_x < 8:
            cur_x += 1
        else:
            pass

if __name__ == '__main__':
    curses.wrapper(start)
Run Code Online (Sandbox Code Playgroud)

msw*_*msw 5

文档被破坏了.我当天用过诅咒,但libncurses对我来说是个新手.

我的第一个提示来自ncurses(3):

ncurses库允许操作称为窗口的数据结构,可以将其视为表示CRT屏幕的全部或部分的二维字符数组.提供了一个名为stdscr的默认窗口,它是终端屏幕的大小.其他人可能会用newwin创建....也可以操纵称为垫的特殊窗口.这些窗口不受屏幕大小的限制,其内容不需要完全显示.

但后来刷新(3)明显回避:

例程wrefresh通过首先调用wnoutrefresh来工作,它将命名窗口复制到虚拟屏幕,然后调用doupdate,它将虚拟屏幕与物理屏幕进行比较并进行实际更新....上面的短语"将命名窗口复制到虚拟屏幕"是不明确的.实际发生的是窗口中所有触摸(更改)的行都被复制到虚拟屏幕.这会影响使用重叠窗口的程序; 这意味着如果两个窗口重叠,您可以按任意顺序刷新它们,只有在显式更改时才会修改重叠区域.[强调我的]

这促使我尝试添加

stdscr.refresh()
Run Code Online (Sandbox Code Playgroud)

在你pad.refresh()工作之后.然后我进一步向上移动start(),看看是否真的需要每次修改垫.我把它一直移动到第一点,有一个stdscr与屈服一起工作:

def start(stdscr):
    stdscr.refresh()
    curses.curs_set(0)
    …
Run Code Online (Sandbox Code Playgroud)

有点像伏都教编程,但我不会看一个20年历史的图书馆内部,以应对玻璃ttys尝试grok它.