【问题标题】:How to adapt output to changing terminal's width如何使输出适应不断变化的终端宽度
【发布时间】:2017-03-13 20:20:48
【问题描述】:

我正在尝试编写一个函数,该函数在 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 个字符),这可以正常工作。但是,快速减小终端宽度会导致长线换行,从而破坏输出。有没有办法解决这个问题?

【问题讨论】:

标签: python terminal curses terminfo blessed


【解决方案1】:

这个问题指的是blessed 1.9.1 之类的东西,它声称它是curses 的简化包装。由于 Python curses 支持在 SIGWINCH 上重新绘制,因此该断言将延续到此包。实际上,描述的功能是针对 terminfo 的。 curses 比页面显示的要多得多。

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

或者你可以使用 curses,在从 getch 读取 KEY_RESIZE 后重新绘制。

【讨论】:

  • 谢谢托马斯,但这并不能帮助我解决问题。我一开始尝试了curses,但问题是它将终端置于“全屏”模式(类似于man 命令),而我希望我的输出与终端中的所有其他输出一起出现。 blessed 包就是这样做的。剩下的唯一问题是如何在终端收缩时正确防止换行。
猜你喜欢
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多