2015-08-11 3 views
2

Я хочу для вывода цветного текста укомплектовать выровнен вправо в терминале (как в этом скриншоте Pacman (packet manager of the arch linux distribution) (не цветной)) pacman text aligned to the rightвыхода цвета, выравнивание по правому краю текст в терминал

В настоящее время я используя format:

import shutil 
left = "foo" 
right = "bar" 
width = shutil.get_terminal_size().columns 
template = "{left:30}{right:{width}}".format(left=left, right=right, width=width-30) 
click.echo(template) 
# click.echo works just like print with some additional features 

Это прекрасно работает, пока я не добавить цвета с помощью кодов ANSI эвакуационных:

left = click.style("foo", fg="red") 
right = click.style("bar", fg="green") 
# click.style just adds ANSI codes for colors and bold etc. 

Который выглядит например: enter image description here

I.e. правая сторона не полностью выровнена по правому краю. Что является «правильным», потому что right на самом деле \\x1b[32mbar\\x1b[0m, который, конечно, имеет более высокую длину, чем bar, и поэтому для выравнивания по правому краю требуется меньше мест. Пока терминал не получит текст и отобразит только bar (с цветом).

Я пропустил что-нибудь в python std lib или click? Или есть простая библиотека, которая имеет дело с цветами и выравниванием терминалов, которые могут мне помочь? Или есть простое решение этой проблемы?

+0

AttributeError: объект 'shutil' не имеет атрибута 'get_terminal_size' – xApple

+0

@xApple вы, вероятно, на python2, поскольку версия 3.3 shutil имеет ['get_terminal_size'] (https://docs.python.org/3/library/ shutil.html # shutil.get_terminal_size). – syntonym

+0

Ну, вопрос был помечен только «python», а не «python3». 2-я серия по-прежнему является значением по умолчанию при неопределенной IMO. – xApple

ответ

0

click В документации не упоминается выравнивание (именно поэтому вы используете встроенный в python класс string). Вы можете оставаться в пределах текущего набора интерфейсов, сообщая вашему сценарию помнить длину строк перед вызовом click.style и добавив разницу в ширину, используемую для вызова формата. (Это не сработает, если вы центрируете текст).

Возможно, имеются другие библиотеки, но вы можете использовать интерфейс curses с функцией filter для рисования однострочных дисплеев.

+0

Извините, я рассказал о диспетчере пакетов дистрибутива арки linux, названном [pacman] (https://wiki.archlinux.org/index.php/Pacman). – syntonym

-1

Во-первых, я хочу, чтобы выяснить, что click обеспечивают способ получить терминальный размер: click.get_terminal_size, документация here

>>> import click 
>>> click.get_terminal_size() 
>>> (66, 24) # (width, height) 

И мое решение, должно работать даже при изменении размера терминала:

width = click.get_terminal_size()[0] 
left = click.style("foo", fg="red") 
right = click.style("bar", fg="green") 
print "{0:}{1:>{2}}".format(left, right, width+6) 

С right на самом деле есть \x1b[32mbar\x1b[0m, мы увеличиваем ширину вручную, чтобы избежать проблемы.

Редактировать: PyFormat полезен для меня, когда используется строковый формат в python. Это помогает мне понять формирование струн. Надеюсь, это поможет вам.

+0

Является ли «размер» цветовых кодов ascii всегда 6? Что такое жирный текст или несколько цветов? – syntonym

+0

@syntonym Кажется, что с bg или fg или полужирным шрифтом '+ 6' все еще работает. –

+0

полужирный ** или ** fg ** или ** bg отлично работает. К сожалению, что-то вроде 'right = click.style ("bar", fg = "red", bg = "green", bold = True) 'не будет работать (потому что в этом случае он должен быть + 3 * 6. Somethinig вроде' right = click.style ("foo ", fg =" red ") +" "+ click.style (" bar ", fg =" green ")' также не будет работать. – syntonym

Смежные вопросы