Как адаптировать вывод к изменению ширины терминала

Я пытаюсь написать функцию, которая будет производить простой виджет при запуске в консоли 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 ответ

Вопрос относится к чему-то вроде блаженной версии 1.9.1, которая утверждает, что это упрощенная оболочка для проклятий. Так как Python curses обеспечивает поддержку перерисовки на SIGWINCH Утверждение будет перенесено в этот пакет. На самом деле описанные функции предназначены для terminfo. curses делает намного больше, чем показывает эта страница.

Обрабатывать SIGWINCH используя blessed, вы должны поймать это в своем скрипте и вызвать перерисовку экрана. Пример, показанный в Высота и Ширина, должно быть достаточно для начала.

Или вы можете использовать проклятия, где вы будете делать перерисовку после прочтения KEY_RESIZE от getch,

Другие вопросы по тегам