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