Равномерно расположенные столбцы с использованием полноэкранного приложения prompt-toolkit, независимо от ширины содержимого

#python #tui #prompt-toolkit

#питон #туи #prompt-toolkit

Вопрос:

Используя prompt_toolkit, я хотел бы создать равномерно распределенный вертикальный макет, независимо от ширины содержимого в каждом окне (полноэкранное приложение). Нежелательное поведение — при изменении содержимого в одном [или нескольких] элементах управления макет пересчитывается для размещения более широкого или более узкого динамического содержимого.

Есть ли способ сделать макет статичным для заданного размера экрана; а именно, отображать окна только при инициализации или изменении размера, сохраняя столбцы макета равномерно расположенными?

Пример кода ниже (нажмите c , чтобы вставить содержимое произвольной длины в любой столбец, ширина макета изменится). Даже добавление пользовательского сообщения может привести к неравномерной инициализации ширины на достаточно узком терминале..

 from random import randint

from prompt_toolkit.application import Application
from prompt_toolkit.key_binding import KeyBindings
from prompt_toolkit.layout.containers import VSplit, Window
from prompt_toolkit.layout.controls import FormattedTextControl
from prompt_toolkit.layout.layout import Layout

user_msg = "press 'c' to change, 'q' to quit"

body = VSplit(
    [
        Window(FormattedTextControl(text=user_msg)),
        Window(width=1, char="|"),
        Window(FormattedTextControl()),
    ]
)

kb = KeyBindings()


@kb.add("c")
def change_content(event):
    for w in event.app.layout.find_all_windows():
        prev_width = f"prev_width: {w.render_info.window_width}"
        rand_str = "*" * randint(1, 50)
        w.content.text = "n".join([prev_width, rand_str])


@kb.add("q")
def quit(event):
    event.app.exit()


layout = Layout(body)
app = Application(layout=layout, key_bindings=kb, full_screen=True)
app.run()
  

Ответ №1:

Передача аргумента ignore_content_width работает.

 body = VSplit(
    [
        Window(FormattedTextControl(text=user_msg), ignore_content_width=True),
        Window(width=1, char="|"),
        Window(FormattedTextControl(), ignore_content_width=True),
    ]
)