#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),
]
)