Python的curses模块在收到第一个字符之前不会刷新pad

Ric*_*ckD 9 python curses python-curses

我有以下代码,允许您向上和向下滚动文本垫.每次滚动(即处理用户输入)时,打击垫都会按预期更新.但是,在按下第一个键之前没有显示任何内容,尽管我正在调用pad.refresh(),就像我在每个用户输入后一样.

我的代码看起来像这样:

def main(self,stdscr):

    x,y = 20,150 # size of the window
    u,a = 10,20 # where to place window - up,across
    pad = curses.newpad(20,150) # nlines, ncols
    pad_pos = 0
    exit = False

    pad.addstr(0,0,str(self.all_results))

    while not exit:
        pad.addstr(0,0,str(self.format_results()))
        ++ stdscr.refresh()
        pad.refresh(pad_pos,10, u,a, x,y)

        -- cmd = stdscr.getch()
        ++ cmd = pad.getch()

        stdscr.nodelay(1)

        + pad.getch() - caused the screen not to update
        + stdscr.refresh() - no change

        if cmd != -1:
            + pad.getch() - - caused the screen not to update
            if  cmd == curses.KEY_DOWN:
                if pad_pos < 3:
                    pad_pos += 1
                try:
                    pad.refresh(pad_pos,0, u,a, x,y)
                except curses.error:
                    pass
            elif cmd == curses.KEY_UP:
                if pad_pos != 0:
                    pad_pos -= 1
                try:
                    pad.refresh(pad_pos,0, u,a, x,y)
                except curses.error:
                    pass
Run Code Online (Sandbox Code Playgroud)

编辑:代码中显示的已更改的更改(+,++, - )

jan*_*ogt 8

stdscr.refresh()在一切按预期工作之前,似乎有(AFAIK无证)必须刷新stdscr一次,即调用.我将此结合到您的示例中(我之前必须完成这项工作 - 请参阅下文):

import curses

def main(stdscr):
    stdscr.keypad(True)
    stdscr.refresh() # This is the necessary initial refresh

    heigth, width = 20, 150 # size of the pad
    top, left = 10, 20 # where to place pad
    viewportHeight = 10
    scrollOffset = 0

    # generate a string to fill pad
    string = ''.join(chr(ord('a') + (x % 26)) for x in range(heigth*width-1))

    pad = curses.newpad(heigth, width)
    pad.addstr(string)
    pad.refresh(scrollOffset, 0, top, left, top + 10, left + width)

    cmd = stdscr.getch()
    while True:
        if  cmd == curses.KEY_DOWN and scrollOffset < heigth - viewportHeight - 1:
            scrollOffset += 1
        elif cmd == curses.KEY_UP and scrollOffset > 0:
            scrollOffset -= 1
        if cmd:
            pad.refresh(scrollOffset, 0, top, left, top + 10, left + width)
        cmd = stdscr.getch()

curses.wrapper(main)
Run Code Online (Sandbox Code Playgroud)

我希望这能解决你的问题!

几点评论:

  • 对于将来,我建议您使用curses.wrapper(main)-function来设置curses环境并main(stdscr)使用stdscras参数调用您的方法.它还需要适当地拆除curses,以防止在代码中出现问题时终端损坏.也许你想看看Kuchling和Raymond关于如何使用python curses包的有用教程.

  • 请提供可重复的示例.你的包含变量,例如self.all_result我必须猜测的地方才能理解你的问题.事实上,我花了更多的时间来弄清楚你的代码正在努力实现什么并重现你所描述的错误行为,而不是找到实际的解决方案.

如果您编辑问题以将其归结为实际问题 - 我认为这对使用Python的curses模块的许多人来说非常有帮助.

谢谢和快乐的黑客;)

编辑:我刚刚意识到你提供了一个从官方来源获得回应的赏金,所以我挖了一点点,并在SO上发现了一个等价的反应,这也表明,这个 - 让我们称它为bug - 到目前为止没有记录.我最好猜测做一些libncurses研究的原因是,curses.wrapper在我的情况下,你手动,甚至libnurses本身在初始化期间的任何时候称为清屏方法.因此,可以设置清除标志,从而在第一次刷新时清除屏幕而不是预期的行为.


小智 0

挂断电话之前尝试stdscr.nodelay(1)先拨打电话stdscr.getch()