Колорама и расстояние

У меня есть класс для печати "TextBoxes", которые похожи на

#========================================#
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
#========================================#

Когда даны размеры. Затем вы можете назначить строки текста, вызвав метод setLineText. Каждая строка сохраняется в списке и печатается с помощью метода render с простым циклом for.

Все работает хорошо и прекрасно, пока я не представлю Colorama в миксе, когда я использую свой метод setLineText с любым форматированием Colorama, которое я изменил, всегда будет короткие 5 пробелов на вызов, который я использовал для форматирования

Например,

MainBox = views.TextBox(35, 6)
MainBox.setLineText(1, "Hello! " + Fore.RED + User.name + Fore.RESET)
MainBox.Render()

будет выводить

#=================================#
| Hello! User           |
|                                 |
|                                 |
|                                 |
#=================================#

У меня вопрос, есть ли способ избежать этого?

РЕДАКТИРОВАТЬ: В качестве дополнительной заметки, я использую окна.

ОТВЕТ: После множества испытаний любое регулярное выражение, которое я мог придумать, не работало. Мое решение состоит в том, чтобы просто использовать sys.stdout.write() для печати изменений цвета и сброса. Это работает хорошо и вряд ли даже нужно изменить мой текущий код

1 ответ

Это потому что setLineText Метод (вероятно) рассматривает символы окраски (Fore.RED, Fore.RESET) как нормальные символы, и поэтому он удаляет 5 пробелов, которые не компенсируются никакими символами (так как символы, используемые для окраски, не отображаются в выходных данных).

Решение состоит в том, чтобы переопределить ваш setLineText метод, который учитывает только печатные символы. (предоставьте реализацию этого метода, если вам нужна конкретная помощь)

РЕДАКТИРОВАТЬ:

Вы просто должны сделать это в начале setLineText метод: (добавить import string в начале файла тоже)

# Extracting printable characters only
textSize = len([c for c in text if c in string.printable])

И используйте этот textSize при выравнивании вашего текста (вместо len (text)).

Вам также может понадобиться убрать текст из любых связанных с цветом символов перед тем, как сделать это. Regex - это путь, и я бы посоветовал вам проверить этот ТАК вопрос (о похожей проблеме с цветовыми кодами mIRC).

Другие вопросы по тегам