Я работаю над интерактивной оболочкой, в которой пользователь вводит какой-то текст, и возвращает текст таким образом, который выглядит как разговор. В недавних пользовательских интерфейсах SMS на андроидах и iphones вы можете видеть текст, выровненный слева для текста, который вы написали, и текст, выровненный справа для текста, который вы получили.
Это эффект, который я хочу достичь, но в оболочке Linux (без фантазии графики, просто поток входов и выходов).
Мне хорошо известны методы format()
и rjust()
, но они требуют знать количество символов, которые вы хотите вставить в значение, и я не знаю ширины текущей оболочки.
Я не ограничусь в lib, который я могу установить или использовать, и я в основном нацелен на платформу Linux, думал, что что-то кросс-платформу всегда приятно.
Используйте curses.
Используйте window.getmaxyx()
, чтобы получить размер терминала.
Другая альтернатива:
import os
rows, cols = os.popen('stty size', 'r').read().split()
Как уже отмечалось, используйте проклятия. Для простых случаев, если вы не хотите использовать проклятия, вы можете использовать переменную среды COLUMNS
(подробнее здесь).
Если несколько строк вывода должны быть правильно оправданы, тогда комбинация:
Что-то вроде:
import textwrap
screen_width = <width of screen>
txt = <text to right justify>
# Right-justifies a single line
f = lambda x : x.rjust(screen_width)
# wrap returns a list of strings of max length 'screen_width'
# 'map' then applies 'f' to each to right-justify them.
# '\n'.join() then combines them into a single string with newlines.
print '\n'.join(map(f, textwrap.wrap(txt, screen_width)))