Как правильно выровнять абзац в оболочке, используя Python?

1

Я работаю над интерактивной оболочкой, в которой пользователь вводит какой-то текст, и возвращает текст таким образом, который выглядит как разговор. В недавних пользовательских интерфейсах SMS на андроидах и iphones вы можете видеть текст, выровненный слева для текста, который вы написали, и текст, выровненный справа для текста, который вы получили.

Это эффект, который я хочу достичь, но в оболочке Linux (без фантазии графики, просто поток входов и выходов).

Мне хорошо известны методы format() и rjust(), но они требуют знать количество символов, которые вы хотите вставить в значение, и я не знаю ширины текущей оболочки.

Я не ограничусь в lib, который я могу установить или использовать, и я в основном нацелен на платформу Linux, думал, что что-то кросс-платформу всегда приятно.

  • 0
    Вы можете попробовать использовать curses или просто предположить, что терминал имеет ширину 80 символов.
  • 0
    «или вы можете просто предположить, что терминал имеет ширину 80 символов» - нет? У нас больше нет 1990 года.
Показать ещё 1 комментарий
Теги:
string
alignment

3 ответа

2
Лучший ответ

Используйте curses.

Используйте window.getmaxyx(), чтобы получить размер терминала.

Другая альтернатива:

import os
rows, cols = os.popen('stty size', 'r').read().split()
  • 1
    Просто знайте, что это сломается, если вы уменьшите размер окна терминала во время работы вашей программы ... bugs.python.org/issue984870
  • 0
    Хорошо, достаточно для меня, спасибо.
2

Как уже отмечалось, используйте проклятия. Для простых случаев, если вы не хотите использовать проклятия, вы можете использовать переменную среды COLUMNS (подробнее здесь).

  • 0
    +1 за упоминание переменной COLUMNS.
0

Если несколько строк вывода должны быть правильно оправданы, тогда комбинация:

Что-то вроде:

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)))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню