Проблемы с выравниванием символов Юникода в python - PullRequest
2 голосов
/ 09 апреля 2020

Я пытаюсь получить выравнивание вертикальных полос в выходных данных следующей программы

print('?  |\n   |')

Специальное 'N' - это U + 1D4A9.

Использование i python в моем терминале (я использую Ubuntu) выравнивание в порядке:

enter image description here

Но если я запускаю точно такой же код в spyder, вывод не будет быть выровненным:

enter image description here

Обратите внимание, что я использую один и тот же шрифт и размер шрифта в обоих примерах (Ubuntu Mono 12). Я также попытался выровнять его, вставив все типы юникодных пробелов различного размера, но безуспешно. Я также проверил jupyter, и он там тоже не выравнивается.

Мой главный вопрос - как мне настроить выравнивание как в терминале, так и в spyder / jupyter. Также было бы интересно узнать, почему он не выравнивается, поскольку я использую точно такой же шрифт. Различия в средствах визуализации шрифтов?

Вот также вывод с терминала в тексте (выглядит немного смещенным в моем браузере):

In [1]: print('?  |\n   |')                                                                                                                                               
?  |
   |

1 Ответ

1 голос
/ 14 апреля 2020

Проблема в текущем выводе Qt для терминалов на основе ячеек заключается в том, что символы различной ширины неправильно выровнены с сеткой ячеек, используемой терминалом. Один из обходных путей - попытаться применить выравнивание, используя другие символы позиционирования, а не просто печатая нестандартные символы. Двумя такими символами являются \t и \b - \t - символ «табуляция» перенаправит печать на следующую «остановку табуляции» - по умолчанию, кратный 8 «ячейкам символов одинарной ширины». То есть используйте: print('?\t|\n\t|') - вот что я получаю в Konsole (другой терминал на базе Qt):

image\t for alignment">

(символ \b означает «возврат», поэтому я напечатал 4 из них, чтобы «отойти» назад на 4 ячейки одинарной ширины, чтобы приблизиться к расположению, которое вы имели в виду)

использовать библиотеку терминалов

Другой вариант очень уместно, если вы хотите интерактивное приложение со сложным макетом (например, отображение цветов, принятие пользовательского ввода без необходимости ждать нажатия клавиши «ввод»), если вы используете библиотеку terminedia (заявление об отказе: автор этого проекта).

Позволяет вам явно работать с терминалом в виде сетки и будет «знать», когда печатаются символы нестандартной ширины, и округлять их ширину до двух ячеек.

Итак, чтобы отобразить то же самое с помощью terminedia, я создал объект «Экран», который позволяет мне использовать print_at в точном месте - полный код, который я использовал:

import terminedia as TM
sc = TM.Screen()
sc.print_at((0, 10),'?  |', color="red")
sc.print_at((0,11), '    | ', color="red")
sc.update()

Чтобы установить terminedia, используйте pip install git+https://github.com/jsbueno/terminedia.git (извините, я виноват в том, что не сделал новую версию)

Output created using terminedia

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...