如何使输出适应更改终端的宽度

时间:2017-03-13 20:20:49

标签: python terminal curses terminfo blessed

我试图编写一个在Python控制台中运行时会生成一个简单小部件的函数。此小部件应该是终端大小感知的。显示小部件后,我将等待用户的键盘输入,并根据类型调整内容。我现在面临的困难是如何在用户调整终端时调整其小部件的显示。这是我现在拥有的代码的简化版本:

def test():
    import blessed
    import signal

    def draw():
        n = term.width - 3
        print("+" + "=" * n + "+" + term.clear_eol)
        print("|" + " " * (n//2 - 2) + 
              "TEST" + " " * (n - n//2 - 2) + "|" + term.clear_eol)
        print("+" + "=" * n + "+" + term.clear_eol)

    def redraw(_, __):
        print(term.move_up * 3, end="")
        draw()

    term = blessed.Terminal()
    draw()
    signal.signal(signal.SIGWINCH, redraw)
    with term.cbreak():
        term.inkey()

如果用户扩展终端,或者如果他缩小终端但速度非常慢(一次只有1个字符),则此方法正常。但是,快速减小端子宽度会导致长线缠绕,从而破坏输出。有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:0)

问题涉及类似blessed 1.9.1的问题,它声称它是curses的简化包装器。由于Python curses为SIGWINCH上的重新绘制提供了支持,因此断言将继续使用此包。实际上,所描述的功能适用于 terminfo 。 curses比那个页面显示的要多得多。

要使用祝福处理SIGWINCH,您必须在脚本中捕获该内容并触发重新绘制屏幕。 Height and Width中显示的示例应该足以开始。

或者您可以使用curses,在从KEY_RESIZE阅读getch后进行重新绘制。